def migrate_legacy_categories(self): print cformat('%{white!}migrating legacy categories') indexes = [ self.zodb_root['categories'], self.zodb_root['catalog']['categ_conf_sd']._container ] indexes += [ self.zodb_root['indexes'][x]._idxCategItem for x in ('category', 'categoryDate', 'categoryDateAll') ] mapping = {} for categ in self._committing_iterator(self._get_categories()): if not hasattr(categ, '_old_id'): new_id = self.gen_categ_id() index_data = [idx.pop(categ.id, None) for idx in indexes] categ._old_id = categ.id categ.id = new_id for idx, data in zip(indexes, index_data): assert categ.id not in idx if data is not None: idx[categ.id] = data self.zodb_root['categories'][categ.id] = categ IndexedCategory.find(id=categ._old_id).update( {IndexedCategory.id: categ.id}) FavoriteCategory.find(target_id=categ._old_id).update( {FavoriteCategory.target_id: categ.id}) db.session.add( LegacyCategoryMapping(legacy_category_id=categ._old_id, category_id=int(categ.id))) print cformat('%{green}+++%{reset} ' '%{white!}{:6s}%{reset} %{cyan}{}').format( categ._old_id, int(categ.id)) else: # happens if this importer was executed before but you want to add the mapping to your DB again db.session.add( LegacyCategoryMapping(legacy_category_id=categ._old_id, category_id=int(categ.id))) msg = cformat( '%{green}+++%{reset} ' '%{white!}{:6s}%{reset} %{cyan}{}%{reset} %{yellow}(already updated in zodb)' ) print msg.format(categ._old_id, int(categ.id)) mapping[categ._old_id] = categ.id print cformat('%{white!}fixing subcategory lists') for categ in self._committing_iterator( self.flushing_iterator( self.zodb_root['categories'].itervalues())): for subcateg_id in categ.subcategories.keys(): new_id = mapping.get(subcateg_id) if new_id is not None: categ.subcategories[new_id] = categ.subcategories.pop( subcateg_id) categ._p_changed = True
def _migrate_category(self, old_cat, position): # unlimited visibility is 999 but we have a 994 for some reason.. since nobody # has 900 levels of nesting we can just go for that threshold instead visibility = None if old_cat._visibility > 900 else old_cat._visibility if visibility == 0: self.print_warning( "Raising visibility from 'invisible' to 'category-only'", event_id=old_cat.id) visibility = 1 emails = re.split( r'[\s;,]+', convert_to_unicode(getattr(old_cat, '_notifyCreationList', ''))) emails = {sanitize_email(email).lower() for email in emails} emails = sorted(email for email in emails if is_valid_mail(email, False)) default_themes = self._process_default_themes(old_cat) title = self._fix_title(convert_to_unicode(old_cat.name), old_cat.id) if is_legacy_id(old_cat.id): # if category has a legacy (non-numeric) ID, generate a new ID # and establish a mapping (for URL redirection) new_id = self.gen_categ_id() db.session.add( LegacyCategoryMapping(legacy_category_id=old_cat.id, category_id=new_id)) self.print_success('%[white!]{:6s}%[reset] -> %[cyan]{}'.format( old_cat.id, new_id)) else: new_id = int(old_cat.id) if hasattr(old_cat, '_timezone'): tz_name = old_cat._timezone else: tz_name = self.makac_info._timezone cat = Category(id=int(new_id), position=position, title=title, description=convert_to_unicode(old_cat.description), visibility=visibility, timezone=convert_to_unicode(tz_name), event_creation_notification_emails=emails, default_event_themes=default_themes, suggestions_disabled=getattr(old_cat, '_suggestions_disabled', False)) if not self.quiet: self.print_success(cat.title, event_id=cat.id) if old_cat._icon: self._process_icon(cat, old_cat._icon) self._process_protection(cat, old_cat) self.migrate_category_attachments(cat, old_cat) cat.children = [(self._migrate_category(old_subcat, i)) for i, old_subcat in enumerate( sorted(old_cat.subcategories.itervalues(), key=attrgetter('_order')), 1)] # add to user favorites for user in self.global_ns.user_favorite_categories[old_cat.id]: user.favorite_categories.add(cat) self.global_ns.legacy_category_ids[old_cat.id] = cat return cat