Пример #1
0
    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))
Пример #2
0
    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)
Пример #3
0
def index(env, data):
    insure_is_xhr(env)

    return env.render_to_response('index', dict(
        title=u'Редакторский интерфейс сайта',
        menu='index',
        dashboard=env.dashboard(env),
    ))
Пример #4
0
def index(env, data):
    insure_is_xhr(env)

    return env.render_to_response(
        'index',
        dict(
            title=u'Редакторский интерфейс сайта',
            menu='index',
            dashboard=env.dashboard(env),
        ))
Пример #5
0
    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)))
Пример #6
0
    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})
Пример #7
0
    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)
Пример #8
0
    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,
        ))
Пример #9
0
    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)))
Пример #10
0
    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)
Пример #11
0
 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'Очередь публикации',
     ))