def edit_log(self, env, data): insure_is_xhr(env) if getattr(env, 'version', None) == 'front': raise HTTPNotFound() EditLog = env.edit_log_model query = EditLog.query_for_item(env.db, data.item) stream = self.stream log_url = stream.url_for(env, self.action, item=data.item.id) paginator = ModelPaginator(env.request, query, impl=FancyPageRange(), limit=30, url=log_url) def get_lang(obj): return decode_stream_uid(obj.stream_name)[1].get('lang') #paginator.items = [expand_stream(env, obj) for obj in paginator.items] return env.render_to_response('edit_log/index', dict(paginator=paginator, stream=self.stream, get_lang=get_lang, item=data.item, log_type_title=self.log_type_title))
def preview(self, env, data): insure_is_xhr(env) item = data.item tdata = dict(filter_form=data.filter_form, roles=env.user.roles, item=item, item_url=self.item_url(env, data, item), stream=self.stream, stream_url=self.stream.url_for(env), stream_title=self.stream.config.title, title=unicode(item), menu=self.stream.module_name, actions=[x for x in self.stream.actions if x.for_item and x.is_visible(env, item) and x.action not in ('preview', 'delete')]) if self.item_lock: tdata = dict(tdata, item_lock=self.item_lock, item_global_id=ItemLock.item_global_id(item), lock_message=data.lock_message, edit_session=data.edit_session or data.owner_session, lock_timeout=env.cfg.MODEL_LOCK_RENEW) return env.render_to_response('preview', tdata)
def index(env, data): insure_is_xhr(env) return env.render_to_response('index', dict( title=u'Редакторский интерфейс сайта', menu='index', dashboard=env.dashboard(env), ))
def index(env, data): insure_is_xhr(env) return env.render_to_response( 'index', dict( title=u'Редакторский интерфейс сайта', menu='index', dashboard=env.dashboard(env), ))
def log_entry(self, env, data): insure_is_xhr(env) if getattr(env, 'version') == 'front': raise HTTPNotFound() EditLog = env.edit_log_model log = EditLog.query_for_item(env.db, data.item)\ .filter_by(id=data.log_id)\ .first() rel_stream_name, params = decode_stream_uid(log.stream_name) if rel_stream_name not in env.streams: # Deleted or renamed stream raise NotImplementedError rel_stream = env.streams[rel_stream_name] rel_env = VersionedStorage(**params) rel_env._storage._parent_storage = env form_cls = rel_stream.config.ItemForm form1 = form_cls.load_initial(env, data.item, initial={}) form2 = form_cls.load_initial(env, data.item, initial={}) form1.accept(log.before) form2.accept(log.after) fields = sum([x.field_names for x in form1.fields], []) changed_fields = [] for field in fields: if not field: continue data1 = self.get_field_data(form1, field) data2 = self.get_field_data(form2, field) if data1 != data2: changed_fields.append(field) # XXX form1 = form_cls.load_initial(env, data.item.__class__(), initial=form1.python_data, permissions='r') form2 = form_cls.load_initial(env, data.item.__class__(), initial=form2.python_data, permissions='r') return env.render_to_response('edit_log/item', dict(form1=form1, form2=form2, changed_fields=changed_fields, log=log, stream=self.stream, item=data.item, log_type=self.log_type_title(log)))
def delete_flag_handler(self, env, data): insure_is_xhr(env) if env.request.method != 'POST': return DeleteItemHandler.__call__(self, env, data) self.stream.insure_has_permission(env, 'd') data.item.delete() env.db.commit() stream_url = self.stream.url_for(env).qs_set( data.filter_form.get_data()) return env.json({'result': 'success', 'location': stream_url})
def delete_item_handler(self, env, data): insure_is_xhr(env) item, edit_session, lock_message, filter_form = \ data.item, data.edit_session, data.lock_message, data.filter_form stream = self.stream self.insure_is_available(env, item) stream_url = stream.url_for(env).qs_set(filter_form.get_data()) item_url = stream.url_for(env, 'item', item=item.id).qs_set(filter_form.get_data()) delete_url = stream.url_for(env, 'delete', item=item.id) \ .qs_set(filter_form.get_data()) all_referrers = self._list_referrers(env, item) section_referrers = { ref: url for (ref, url) in all_referrers.items() if getattr(ref, 'parent_id', None) == item.id } other_referrers = { ref: url for (ref, url) in all_referrers.items() if ref not in section_referrers } if env.request.method == 'POST': self.stream.insure_has_permission(env, 'd') for section in section_referrers.keys(): self.mark_as_deleted(env, section) self.mark_as_deleted(env, item) env.db.commit() return env.json({'result': 'success', 'location': stream_url}) data = dict(item=item, item_url=item_url, form_url=delete_url, section_referers=section_referrers, other_referers=other_referrers, title=u'Удаление объекта «%s»' % item, stream=stream, stream_url=stream_url, menu=stream.module_name) return env.render_to_response('recursive_delete', data)
def tray(self, env, data): insure_is_xhr(env) env.models = env.models.admin env.version = 'admin' tray = env.db.query(self.Tray).get(data.tray) if tray is None: raise HTTPNotFound() objects = env.db.query(self.ObjectTray).filter_by(tray=tray).all() items = [expand_stream(env, obj) for obj in objects] #changed.sort(key=lambda x: x.date_changed) return env.render_to_response('tray', dict( tray = tray, items = items, menu = env.current_location, title = tray.title, ))
def log_entry(self, env, data): insure_is_xhr(env) if getattr(env, 'version', None) == 'front': raise HTTPNotFound() EditLog = env.edit_log_model log = EditLog.query_for_item(env.db, data.item)\ .filter_by(id=data.log_id)\ .first() rel_stream_name, params = decode_stream_uid(log.stream_name) if rel_stream_name not in env.streams: # Deleted or renamed stream raise NotImplementedError rel_stream = env.streams[rel_stream_name] rel_env = VersionedStorage(**params) rel_env._storage._parent_storage = env form_cls = rel_stream.config.ItemForm form1 = form_cls.load_initial(env, data.item, initial={}) form2 = form_cls.load_initial(env, data.item, initial={}) form1.accept(log.before) form2.accept(log.after) # reset permissions form1.permissions = form2.permissions = frozenset('r') form1.fields = [field(parent=form1) for field in form1.fields] form2.fields = [field(parent=form2) for field in form2.fields] diff = form1.get_diff(form2) diffs = diff['children'] if diff is not None else [] return env.render_to_response('edit_log/item', dict(form1=form1, form2=form2, diffs=diffs, log=log, stream=self.stream, item=data.item, log_type=self.log_type_title(log)))
def delete_item_handler(self, env, data): insure_is_xhr(env) item, edit_session, lock_message, filter_form = \ data.item, data.edit_session, data.lock_message, data.filter_form stream = self.stream self.insure_is_available(env, item) stream_url = stream.url_for(env).qs_set(filter_form.get_data()) item_url = stream.url_for(env, 'item', item=item.id).qs_set( filter_form.get_data()) delete_url = stream.url_for(env, 'delete', item=item.id) \ .qs_set(filter_form.get_data()) all_referrers = self._list_referrers(env, item) section_referrers = {ref: url for (ref, url) in all_referrers.items() if getattr(ref, 'parent_id', None) == item.id} other_referrers = {ref: url for (ref, url) in all_referrers.items() if ref not in section_referrers} if env.request.method == 'POST': self.stream.insure_has_permission(env, 'd') for section in section_referrers.keys(): self.mark_as_deleted(env, section) self.mark_as_deleted(env, item) env.db.commit() return env.json({'result': 'success', 'location': stream_url}) data = dict(item=item, item_url=item_url, form_url=delete_url, section_referers=section_referrers, other_referers=other_referrers, title=u'Удаление объекта «%s»' % item, stream=stream, stream_url=stream_url, menu=stream.module_name) return env.render_to_response('recursive_delete', data)
def publish_queue(self, env, data): insure_is_xhr(env) # XXX env.models = env.models.admin env.version = 'admin' changed = [] for stream in self.streams.values(): if isinstance(stream, PublishStream): items = stream.item_query(env)\ .filter_by(has_unpublished_changes=True) if hasattr(stream.config.Model, 'state'): items = items.filter_by(state=stream.config.Model.PUBLIC) items = items.all() changed += [(stream, item) for item in items] #changed.sort(key=lambda x: x.date_changed) return env.render_to_response('publish_queue', dict( changed = changed, menu = env.current_location, title = u'Очередь публикации', ))