def migrate_legacy_events(self): print cformat('%{white!}migrating legacy events') # XXX: removed display manager / internal page manager update # don't forget to handle them when updating this for 2.0! wfr = self.zodb_root['webfactoryregistry'] for event in self._committing_iterator(self._get_events()): if not hasattr(event, '_old_id'): new_id = self.gen_event_id() event.unindexConf() del self.zodb_root['conferences'][event.id] wf = wfr.pop(event.id, None) event._old_id = event.id event.id = new_id if wf is not None: wfr[event.id] = wf self.zodb_root['conferences'][event.id] = event event.indexConf() EventSetting.find(event_id=event._old_id).update({EventSetting.event_id: event.id}) EventSettingPrincipal.find(event_id=event._old_id).update({EventSettingPrincipal.event_id: event.id}) db.session.add(LegacyEventMapping(legacy_event_id=event._old_id, event_id=int(event.id))) if not self.quiet: self.print_success(cformat('%{cyan}{}').format(event.id), event_id=event._old_id) else: # happens if this importer was executed before but you want to add the mapping to your DB again db.session.add(LegacyEventMapping(legacy_event_id=event._old_id, event_id=int(event.id))) if not self.quiet: self.print_success(cformat('%{cyan}{}%{reset} %{yellow}(already updated in zodb)').format(event.id), event_id=event._old_id)
def _redirect_legacy_id(): if not request.view_args or request.endpoint in _non_standard_id_endpoints: return key = event_id = None if 'confId' in request.view_args: key = 'confId' event_id = request.view_args['confId'] elif 'event_id' in request.view_args: key = 'event_id' event_id = request.view_args['event_id'] if event_id is None or not is_legacy_id(event_id): return if request.method != 'GET': raise BadRequest('Unexpected non-GET request with legacy event ID') mapping = LegacyEventMapping.find_first(legacy_event_id=event_id) if mapping is None: raise NotFound(f'Legacy event {event_id} does not exist') request.view_args[key] = str(mapping.event_id) return redirect( url_for(request.endpoint, **dict(request.args.to_dict(), **request.view_args)), 301)
def migrate(self): if self.is_legacy_event: db.session.add( LegacyEventMapping(legacy_event_id=self.conf.id, event_id=self.event.id)) if not self.quiet: self.print_success('-> %[cyan]{}'.format(self.event.id))
def event_or_shorturl(confId, shorturl_namespace=False, force_overview=False): func = None event_ = Event.get(int(confId)) if confId.isdigit() else None if event_ and event_.is_deleted: raise NotFound(_('This event has been deleted.')) elif event_: # For obvious reasons an event id always comes first. # If it's used within the short url namespace we redirect to the event namespace, otherwise # we call the RH to display the event if shorturl_namespace: func = lambda: redirect(event_.url) else: request.view_args['confId'] = int(request.view_args['confId']) func = lambda: RHDisplayEvent().process() else: shorturl_event = (Event.query.filter( db.func.lower(Event.url_shortcut) == confId.lower(), ~Event.is_deleted).one_or_none()) if (shorturl_namespace or config.ROUTE_OLD_URLS) and shorturl_event: if shorturl_namespace: # Correct namespace => redirect to the event func = lambda: redirect(shorturl_event.url) else: # Old event namespace => 301-redirect to the new shorturl first to get Google etc. to update it func = lambda: redirect(shorturl_event.short_url, 301) elif is_legacy_id(confId): mapping = LegacyEventMapping.find_first(legacy_event_id=confId) if mapping is not None: url = url_for('events.display', confId=mapping.event_id) func = lambda: redirect(url, 301) if func is None: raise NotFound(_('An event with this ID/shortcut does not exist.')) return func()
def event_or_shorturl(confId, shorturl_namespace=False, force_overview=False): func = None event_ = Event.get(int(confId)) if confId.isdigit() else None if event_ and event_.is_deleted: raise NotFound(_('This event has been deleted.')) elif event_: # For obvious reasons an event id always comes first. # If it's used within the short url namespace we redirect to the event namespace, otherwise # we call the RH to display the event if shorturl_namespace: func = lambda: redirect(event_.url) else: request.view_args['confId'] = int(request.view_args['confId']) func = lambda: RHDisplayEvent().process() else: shorturl_event = (Event.query .filter(db.func.lower(Event.url_shortcut) == confId.lower(), ~Event.is_deleted) .one_or_none()) if (shorturl_namespace or config.ROUTE_OLD_URLS) and shorturl_event: if shorturl_namespace: # Correct namespace => redirect to the event func = lambda: redirect(shorturl_event.url) else: # Old event namespace => 301-redirect to the new shorturl first to get Google etc. to update it func = lambda: redirect(shorturl_event.short_url, 301) elif is_legacy_id(confId): mapping = LegacyEventMapping.find_first(legacy_event_id=confId) if mapping is not None: url = url_for('events.display', confId=mapping.event_id) func = lambda: redirect(url, 301) if func is None: raise NotFound(_('An event with this ID/shortcut does not exist.')) return func()
def test_legacy_ids(db, dummy_event, test_client, url, legacy_id): db.session.add( LegacyEventMapping(legacy_event_id=legacy_id, event=dummy_event)) rv = test_client.get(url.format(legacy_id)) assert rv.status_code == 301 assert rv.headers['Location'] == 'http://localhost' + url.format( dummy_event.id)
def getById(self, id, quiet=False): id = str(id) if is_legacy_id(id): mapping = LegacyEventMapping.find_first(legacy_event_id=id) id = str(mapping.event_id) if mapping is not None else None event = self._getIdx().get(id) if id is not None else None if event is None and not quiet: raise NotFoundError( _("The event with id '{}' does not exist or has been deleted" ).format(id), title=_("Event not found")) return event
def _event_or_shorturl(confId, shorturl_namespace=False, ovw=False): from MaKaC.conference import ConferenceHolder from MaKaC.common.url import ShortURLMapper func = None with DBMgr.getInstance().global_connection(): ch = ConferenceHolder() su = ShortURLMapper() if ch.hasKey(confId): # For obvious reasons an event id always comes first. # If it's used within the short url namespace we redirect to the event namespace, otherwise # we call the RH to display the event if shorturl_namespace: url = UHConferenceDisplay.getURL(ch.getById(confId)) func = lambda: redirect(url) else: params = request.args.to_dict() params['confId'] = confId if ovw: params['ovw'] = 'True' func = lambda: conferenceDisplay.RHConferenceDisplay().process( params) elif (shorturl_namespace or app.config['INDICO_COMPAT_ROUTES']) and su.hasKey(confId): if shorturl_namespace: # Correct namespace => redirect to the event url = UHConferenceDisplay.getURL(su.getById(confId)) func = lambda: redirect(url) else: # Old event namespace => 301-redirect to the new shorturl first to get Google etc. to update it url = url_for('.shorturl', confId=confId) func = lambda: redirect(url, 301) elif is_legacy_id(confId): mapping = LegacyEventMapping.find_first(legacy_event_id=confId) if mapping is not None: url = url_for('event.conferenceDisplay', confId=mapping.event_id) func = lambda: redirect(url, 301) if func is None: raise NotFound( _('The specified event with id or tag "{}" does not exist or has been deleted' ).format(confId)) return func()
def _event_or_shorturl(confId, shorturl_namespace=False, ovw=False): from MaKaC.conference import ConferenceHolder from MaKaC.common.url import ShortURLMapper func = None with DBMgr.getInstance().global_connection(): ch = ConferenceHolder() su = ShortURLMapper() if ch.hasKey(confId): # For obvious reasons an event id always comes first. # If it's used within the short url namespace we redirect to the event namespace, otherwise # we call the RH to display the event if shorturl_namespace: url = UHConferenceDisplay.getURL(ch.getById(confId)) func = lambda: redirect(url) else: params = request.args.to_dict() params['confId'] = confId if ovw: params['ovw'] = 'True' func = lambda: conferenceDisplay.RHConferenceDisplay().process(params) elif (shorturl_namespace or app.config['INDICO_COMPAT_ROUTES']) and su.hasKey(confId): if shorturl_namespace: # Correct namespace => redirect to the event url = UHConferenceDisplay.getURL(su.getById(confId)) func = lambda: redirect(url) else: # Old event namespace => 301-redirect to the new shorturl first to get Google etc. to update it url = url_for('.shorturl', confId=confId) func = lambda: redirect(url, 301) elif is_legacy_id(confId): mapping = LegacyEventMapping.find_first(legacy_event_id=confId) if mapping is not None: url = url_for('event.conferenceDisplay', confId=mapping.event_id) func = lambda: redirect(url, 301) if func is None: raise NotFound(_('The specified event with id or tag "{}" does not exist or has been deleted').format(confId)) return func()
def _redirect_legacy_id(): if not request.view_args or request.endpoint in _shorturl_endpoints: return key = event_id = None if 'confId' in request.view_args: key = 'confId' event_id = request.view_args['confId'] elif 'event_id' in request.view_args: key = 'event_id' event_id = request.view_args['event_id'] if event_id is None or not is_legacy_id(event_id): return if request.method != 'GET': raise BadRequest('Unexpected non-GET request with legacy event ID') mapping = LegacyEventMapping.find_first(legacy_event_id=event_id) if mapping is None: raise NotFound('Legacy event {} does not exist'.format(event_id)) request.view_args[key] = unicode(mapping.event_id) return redirect(url_for(request.endpoint, **dict(request.args.to_dict(), **request.view_args)), 301)
def _redirect_legacy_id(): if not request.view_args or request.endpoint in _non_standard_id_endpoints: return key = event_id = None if "confId" in request.view_args: key = "confId" event_id = request.view_args["confId"] elif "event_id" in request.view_args: key = "event_id" event_id = request.view_args["event_id"] if event_id is None or not is_legacy_id(event_id): return if request.method != "GET": raise BadRequest("Unexpected non-GET request with legacy event ID") mapping = LegacyEventMapping.find_first(legacy_event_id=event_id) if mapping is None: raise NotFound("Legacy event {} does not exist".format(event_id)) request.view_args[key] = unicode(mapping.event_id) return redirect(url_for(request.endpoint, **dict(request.args.to_dict(), **request.view_args)), 301)
def _event_deleted(event, **kwargs): event.as_event.is_deleted = True EventSetting.delete_event(int(event.id)) EventSettingPrincipal.delete_event(int(event.id)) if hasattr(event, '_old_id'): LegacyEventMapping.find(legacy_event_id=event._old_id).delete()