Example #1
0
 def get(self, key):
     """Objekt mit <key> wiederherstellen."""
     archived = DeletedObject.get(key)
     if archived.dblayer == 'ndb':
         entity = ndb.ModelAdapter().pb_to_entity(entity_pb.EntityProto(archived.data))
     else:
         # precondition: model class must be imported
         entity = db.model_from_protobuf(entity_pb.EntityProto(archived.data))
     entity.put()
     archived.delete()
     self.add_message(
         'success',
         u'Objekt <strong><A href="/admin/%s/%s/%s/">%s</a></strong> wurde wieder hergestellt.' % (
             get_app_name(entity.__class__), entity.__class__.__name__, entity.key(), entity))
     raise gaetk.handler.HTTP301_Moved(location='/admin/%s/%s/' % (
         get_app_name(entity.__class__), entity.__class__.__name__))
Example #2
0
    def get_model_class(self, application, model):
        """Klasse zu 'model' zurückgeben."""

        for model_class in self._registry:
            if model == xdb_kind(
                    model_class) and application == util.get_app_name(
                        model_class):
                return model_class
Example #3
0
    def get(self):
        """Zeige Template mit allen registrierten Models an"""

        apps = {}
        for model_class in site.registry.keys():
            application = get_app_name(model_class)
            apps.setdefault(application, []).append(xdb_kind(model_class))
        self.render({'apps': apps}, 'admin/index.html')
Example #4
0
def add_to_index(key):
    """Füge Instanz dem Suchindex hinzu"""
    obj = gaetk.compat.xdb_get(key)
    if obj is None:
        return
    key = gaetk.compat.xdb_key(obj)
    key_name = gaetk.compat.xdb_id_or_name(key)
    skey = gaetk.compat.xdb_str_key(key)
    kind = gaetk.compat.xdb_kind(obj)

    # We have some very nasty problems with cyclic imports
    # site registry depends on options and options depends
    # on a lot of stuff which depends on the site registry
    # admin = gaetk.admin.sites.site._registry.get(type(obj))
    # if hasattr(admin, 'searchdoc'):
    #     data = admin.searchdoc(obj)

    if hasattr(obj, 'as_dict'):
        data = obj.as_dict()
    else:
        key_name = gaetk.compat.xdb_id_or_name(key)
        data = {'key_name': key_name}

    content = (value for value in data.itervalues() if isinstance(value, basestring))

    content = list(content)
    logging.debug(u'content: %s', content)

    fields = [search.TextField(name='key', value=skey),
              search.TextField(name='key_name', value=unicode(key_name)),
              search.TextField(name='str', value=unicode(obj)),
              search.TextField(name='kind', value=gaetk.compat.xdb_kind(obj)),
              search.TextField(name='app', value=get_app_name(obj)),
              search.TextField(name='content', value=' '.join(term for term in content if term)),
              ]

    document = search.Document(doc_id=skey, fields=fields)
    index = search.Index(name=INDEX_NAME)
    try:
        index.put(document)
    except search.Error:
        logging.info(u'Fehler beim Hinzufügen von %s %s zum Suchindex', kind, skey)
Example #5
0
    def add_view(self, handler, extra_context=None):
        """View zum Hinzufügen eines neuen Objekts"""
        form_class = self.get_form()

        # Standardmaessig lassen wir die App Engine fuer das Model automatisch einen
        # Key generieren. Es besteht jedoch in der Admin-Klasse die Moeglichkeit, via
        # 'db_key_field=[propertyname]' ein Feld festzulegen, dessen Inhalt im Formular
        # als Key beim Erzeugen der Instanz genutzt wird.
        admin_class = site.get_admin_class(self.model)
        key_field = None
        if admin_class and hasattr(admin_class, 'db_key_field'):
            key_field = admin_class.db_key_field

        # Wenn das Formular abgeschickt wurde und gültig ist,
        # speichere das veränderte Objekt und leite auf die Übersichtsseite um.
        if handler.request.method == 'POST':
            form = form_class(handler.request.POST)

            if form.validate():
                form_data = self._convert_property_data(form.data)
                key_name = form_data.get(key_field) if key_field else None

                # TODO: util.create_instance nutzen oder entfernen
                if hasattr(self.model, 'create'):
                    factory = self.model.create
                else:
                    factory = self.model

                if issubclass(self.model, ndb.Model):
                    obj = factory(id=key_name, **form_data)
                else:
                    obj = factory(key_name=key_name, **form_data)

                # Beim Anlegen muss dann halt einmal gespeichert werden,
                # ansonsten ist der ID unbekannt.
                if self.blob_upload_fields and key_name is None:
                    key_name = compat.xdb_id_or_name(obj.put())
                    self.handle_blobstore_fields(handler, obj, key_name)

                key = obj.put()
                handler.add_message(
                    'success',
                    u'<strong><a href="/admin/{}/{}/{}/">{} {}</a></strong> wurde angelegt.'
                    .format(util.get_app_name(self.model),
                            compat.xdb_kind(self.model),
                            compat.xdb_str_key(key),
                            compat.xdb_kind(self.model),
                            compat.xdb_id_or_name(key)))

                # Indexierung für Admin-Volltextsuche
                from gaetk.admin.search import add_to_index
                deferred.defer(add_to_index, key)

                # Call post-create-hooks
                if isinstance(self.post_create_hooks, collections.Iterable):
                    for hook in self.post_create_hooks:
                        deferred.defer(util.call_hook, hook,
                                       compat.xdb_str_key(key))

                raise gaetk.handler.HTTP302_Found(location='..')
        else:
            form = form_class()

        template_values = {
            'form': form,
            'field_args': self.field_args,
            'admin_class': self
        }
        if extra_context is not None:
            template_values.update(extra_context)
        handler.render(template_values, self.get_template('add'))
Example #6
0
    def change_view(self, handler, object_id, extra_context=None):
        """View zum Bearbeiten eines vorhandenen Objekts"""

        obj = self.get_object(object_id)
        if obj is None:
            raise gaetk.handler.HTTP404_NotFound

        model_class = type(obj)
        form_class = self.get_form()

        if handler.request.get('delete') == 'yesiwant':
            # Der User hat gebeten, dieses Objekt zu löschen.
            key = compat.xdb_key(obj)
            data = compat.xdb_to_protobuf(obj)
            dblayer = 'ndb' if compat.xdb_is_ndb(obj) else 'db'
            archived = DeletedObject(key_name=str(key),
                                     model_class=model_class.__name__,
                                     old_key=str(key),
                                     dblayer=dblayer,
                                     data=data)
            archived.put()
            # Indexierung für Admin-Volltextsuche
            from gaetk.admin.search import remove_from_index
            if compat.xdb_is_ndb(obj):
                obj.key.delete()
                deferred.defer(remove_from_index, obj.key)
            else:
                obj.delete()
                deferred.defer(remove_from_index, obj.key())

            handler.add_message(
                'warning',
                u'<strong>{} {}</strong> wurde gelöscht. <a href="{}">Objekt wiederherstellen!</a>'
                .format(compat.xdb_kind(self.model),
                        compat.xdb_id_or_name(key), archived.undelete_url()))
            raise gaetk.handler.HTTP302_Found(
                location='/admin/%s/%s/' %
                (util.get_app_name(model_class), compat.xdb_kind(model_class)))

        # Wenn das Formular abgeschickt wurde und gültig ist,
        # speichere das veränderte Objekt und leite auf die Übersichtsseite um.
        if handler.request.method == 'POST':
            form = form_class(handler.request.POST)
            if form.validate():
                key_name = compat.xdb_id_or_name(compat.xdb_key(obj))
                self.handle_blobstore_fields(handler, obj, key_name)
                if hasattr(obj, 'update'):
                    obj.update(form.data)
                else:
                    form.populate_obj(obj)
                key = obj.put()
                handler.add_message(
                    'success',
                    u'<strong><a href="/admin/{}/{}/{}/">{} {}</a></strong> wurde gespeichert.'
                    .format(util.get_app_name(self.model),
                            compat.xdb_kind(self.model),
                            compat.xdb_str_key(key),
                            compat.xdb_kind(self.model),
                            compat.xdb_id_or_name(key)))

                # Indexierung für Admin-Volltextsuche
                from gaetk.admin.search import add_to_index
                deferred.defer(add_to_index, key)
                raise gaetk.handler.HTTP302_Found(
                    location='/admin/%s/%s/' % (util.get_app_name(model_class),
                                                compat.xdb_kind(model_class)))
        else:
            form = form_class(obj=obj)

        template_values = {
            'object': obj,
            'form': form,
            'field_args': self.field_args,
            'admin_class': self
        }
        if extra_context is not None:
            template_values.update(extra_context)
        handler.render(template_values, self.get_template('change'))
Example #7
0
    def get_model_class(self, application, model):
        """Klasse zu 'model' zurückgeben."""

        for model_class in self._registry:
            if model == xdb_kind(model_class) and application == util.get_app_name(model_class):
                return model_class
Example #8
0
    def add_view(self, handler, extra_context=None):
        """View zum Hinzufügen eines neuen Objekts"""
        form_class = self.get_form()

        # Standardmaessig lassen wir die App Engine fuer das Model automatisch einen
        # Key generieren. Es besteht jedoch in der Admin-Klasse die Moeglichkeit, via
        # 'db_key_field=[propertyname]' ein Feld festzulegen, dessen Inhalt im Formular
        # als Key beim Erzeugen der Instanz genutzt wird.
        admin_class = site.get_admin_class(self.model)
        key_field = None
        if admin_class and hasattr(admin_class, 'db_key_field'):
            key_field = admin_class.db_key_field

        # Wenn das Formular abgeschickt wurde und gültig ist,
        # speichere das veränderte Objekt und leite auf die Übersichtsseite um.
        if handler.request.method == 'POST':
            form = form_class(handler.request.POST)

            if form.validate():
                form_data = self._convert_property_data(form.data)
                key_name = form_data.get(key_field) if key_field else None

                # TODO: util.create_instance nutzen oder entfernen
                if hasattr(self.model, 'create'):
                    factory = self.model.create
                else:
                    factory = self.model

                if issubclass(self.model, ndb.Model):
                    obj = factory(id=key_name, **form_data)
                else:
                    obj = factory(key_name=key_name, **form_data)

                # Beim Anlegen muss dann halt einmal gespeichert werden,
                # ansonsten ist der ID unbekannt.
                if self.blob_upload_fields and key_name is None:
                    key_name = compat.xdb_id_or_name(obj.put())
                    self.handle_blobstore_fields(handler, obj, key_name)

                key = obj.put()
                handler.add_message(
                    'success',
                    u'<strong><a href="/admin/{}/{}/{}/">{} {}</a></strong> wurde angelegt.'.format(
                        util.get_app_name(self.model),
                        compat.xdb_kind(self.model),
                        compat.xdb_str_key(key),
                        compat.xdb_kind(self.model),
                        compat.xdb_id_or_name(key)))

                # Indexierung für Admin-Volltextsuche
                from gaetk.admin.search import add_to_index
                deferred.defer(add_to_index, key)

                # Call post-create-hooks
                if isinstance(self.post_create_hooks, collections.Iterable):
                    for hook in self.post_create_hooks:
                        deferred.defer(util.call_hook, hook, compat.xdb_str_key(key))

                raise gaetk.handler.HTTP302_Found(location='..')
        else:
            form = form_class()

        template_values = {'form': form, 'field_args': self.field_args, 'admin_class': self}
        if extra_context is not None:
            template_values.update(extra_context)
        handler.render(template_values, self.get_template('add'))
Example #9
0
    def change_view(self, handler, object_id, extra_context=None):
        """View zum Bearbeiten eines vorhandenen Objekts"""

        obj = self.get_object(object_id)
        if obj is None:
            raise gaetk.handler.HTTP404_NotFound

        model_class = type(obj)
        form_class = self.get_form()

        if handler.request.get('delete') == 'yesiwant':
            # Der User hat gebeten, dieses Objekt zu löschen.
            key = compat.xdb_key(obj)
            data = compat.xdb_to_protobuf(obj)
            dblayer = 'ndb' if compat.xdb_is_ndb(obj) else 'db'
            archived = DeletedObject(key_name=str(key), model_class=model_class.__name__,
                                     old_key=str(key), dblayer=dblayer, data=data)
            archived.put()
            # Indexierung für Admin-Volltextsuche
            from gaetk.admin.search import remove_from_index
            if compat.xdb_is_ndb(obj):
                obj.key.delete()
                deferred.defer(remove_from_index, obj.key)
            else:
                obj.delete()
                deferred.defer(remove_from_index, obj.key())

            handler.add_message(
                'warning',
                u'<strong>{} {}</strong> wurde gelöscht. <a href="{}">Objekt wiederherstellen!</a>'.format(
                    compat.xdb_kind(self.model), compat.xdb_id_or_name(key), archived.undelete_url()))
            raise gaetk.handler.HTTP302_Found(location='/admin/%s/%s/' % (
                util.get_app_name(model_class), compat.xdb_kind(model_class)))

        # Wenn das Formular abgeschickt wurde und gültig ist,
        # speichere das veränderte Objekt und leite auf die Übersichtsseite um.
        if handler.request.method == 'POST':
            form = form_class(handler.request.POST)
            if form.validate():
                key_name = compat.xdb_id_or_name(compat.xdb_key(obj))
                self.handle_blobstore_fields(handler, obj, key_name)
                if hasattr(obj, 'update'):
                    obj.update(form.data)
                else:
                    form.populate_obj(obj)
                key = obj.put()
                handler.add_message(
                    'success',
                    u'<strong><a href="/admin/{}/{}/{}/">{} {}</a></strong> wurde gespeichert.'.format(
                        util.get_app_name(self.model),
                        compat.xdb_kind(self.model),
                        compat.xdb_str_key(key),
                        compat.xdb_kind(self.model),
                        compat.xdb_id_or_name(key)))

                # Indexierung für Admin-Volltextsuche
                from gaetk.admin.search import add_to_index
                deferred.defer(add_to_index, key)
                raise gaetk.handler.HTTP302_Found(location='/admin/%s/%s/' % (
                    util.get_app_name(model_class), compat.xdb_kind(model_class)))
        else:
            form = form_class(obj=obj)

        template_values = {'object': obj, 'form': form, 'field_args': self.field_args, 'admin_class': self}
        if extra_context is not None:
            template_values.update(extra_context)
        handler.render(template_values, self.get_template('change'))