[MM 12458] Include user preferences in bulk export (#9784)
* First version of the preference exporter * First working version of the preference export * Removed useless debug line * Added special case of empty string to harverst the omitempty feature * Removed dangling line from rebase * Moved exportablepreference in scope * Fix go vet issue * Fix formating * Add simple test * Add full test for BulkExportUsers * Improve variable naming
Этот коммит содержится в:
коммит произвёл
George Goldberg
родитель
ee9395f1b6
Коммит
0f35c4b24d
@@ -15,6 +15,41 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// We use this map to identify the exportable preferences.
|
||||
// Here we link the preference category and name, to the name of the relevant filed in the import struct.
|
||||
var exportablePreferences = map[ComparablePreference]string{{
|
||||
Category: model.PREFERENCE_CATEGORY_THEME,
|
||||
Name: "",
|
||||
}: "Theme", {
|
||||
Category: model.PREFERENCE_CATEGORY_ADVANCED_SETTINGS,
|
||||
Name: "feature_enabled_markdown_preview",
|
||||
}: "UseMarkdownPreview", {
|
||||
Category: model.PREFERENCE_CATEGORY_ADVANCED_SETTINGS,
|
||||
Name: "formatting",
|
||||
}: "UseFormatting", {
|
||||
Category: model.PREFERENCE_CATEGORY_SIDEBAR_SETTINGS,
|
||||
Name: "show_unread_section",
|
||||
}: "ShowUnreadSection", {
|
||||
Category: model.PREFERENCE_CATEGORY_DISPLAY_SETTINGS,
|
||||
Name: model.PREFERENCE_NAME_USE_MILITARY_TIME,
|
||||
}: "UseMilitaryTime", {
|
||||
Category: model.PREFERENCE_CATEGORY_DISPLAY_SETTINGS,
|
||||
Name: model.PREFERENCE_NAME_COLLAPSE_SETTING,
|
||||
}: "CollapsePreviews", {
|
||||
Category: model.PREFERENCE_CATEGORY_DISPLAY_SETTINGS,
|
||||
Name: model.PREFERENCE_NAME_MESSAGE_DISPLAY,
|
||||
}: "MessageDisplay", {
|
||||
Category: model.PREFERENCE_CATEGORY_DISPLAY_SETTINGS,
|
||||
Name: "channel_display_mode",
|
||||
}: "ChannelDisplayMode", {
|
||||
Category: model.PREFERENCE_CATEGORY_TUTORIAL_STEPS,
|
||||
Name: "",
|
||||
}: "TutorialStep", {
|
||||
Category: model.PREFERENCE_CATEGORY_NOTIFICATIONS,
|
||||
Name: model.PREFERENCE_NAME_EMAIL_INTERVAL,
|
||||
}: "EmailInterval",
|
||||
}
|
||||
|
||||
func (a *App) BulkExport(writer io.Writer, file string, pathToEmojiDir string, dirNameToExportEmoji string) *model.AppError {
|
||||
if err := a.ExportVersion(writer); err != nil {
|
||||
return err
|
||||
@@ -154,7 +189,45 @@ func (a *App) ExportAllUsers(writer io.Writer) *model.AppError {
|
||||
continue
|
||||
}
|
||||
|
||||
userLine := ImportLineFromUser(user)
|
||||
// Gathering here the exportable preferences to pass them on to ImportLineFromUser
|
||||
exportedPrefs := make(map[string]*string)
|
||||
allPrefs, err := a.GetPreferencesForUser(user.Id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, pref := range allPrefs {
|
||||
// We need to manage the special cases
|
||||
// Here we manage Tutorial steps
|
||||
if pref.Category == model.PREFERENCE_CATEGORY_TUTORIAL_STEPS {
|
||||
pref.Name = ""
|
||||
// Then the email interval
|
||||
} else if pref.Category == model.PREFERENCE_CATEGORY_NOTIFICATIONS && pref.Name == model.PREFERENCE_NAME_EMAIL_INTERVAL {
|
||||
switch pref.Value {
|
||||
case model.PREFERENCE_EMAIL_INTERVAL_NO_BATCHING_SECONDS:
|
||||
pref.Value = model.PREFERENCE_EMAIL_INTERVAL_IMMEDIATELY
|
||||
case model.PREFERENCE_EMAIL_INTERVAL_FIFTEEN_AS_SECONDS:
|
||||
pref.Value = model.PREFERENCE_EMAIL_INTERVAL_FIFTEEN
|
||||
case model.PREFERENCE_EMAIL_INTERVAL_HOUR_AS_SECONDS:
|
||||
pref.Value = model.PREFERENCE_EMAIL_INTERVAL_HOUR
|
||||
case "0":
|
||||
pref.Value = ""
|
||||
}
|
||||
}
|
||||
id, ok := exportablePreferences[ComparablePreference{
|
||||
Category: pref.Category,
|
||||
Name: pref.Name,
|
||||
}]
|
||||
if ok {
|
||||
prefPtr := pref.Value
|
||||
if prefPtr != "" {
|
||||
exportedPrefs[id] = &prefPtr
|
||||
} else {
|
||||
exportedPrefs[id] = nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
userLine := ImportLineFromUser(user, exportedPrefs)
|
||||
|
||||
userLine.User.NotifyProps = a.buildUserNotifyProps(user.NotifyProps)
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user