From e9b0be5cdb4635140e583072dc5fe8abbe6189e7 Mon Sep 17 00:00:00 2001 From: maxperei Date: Sun, 16 Apr 2017 16:14:07 +0200 Subject: [PATCH] initial commit --- .gitignore | 18 + README.md | 10 + db.sqlite3 | Bin 0 -> 143360 bytes django_mongoengine/__init__.py | 6 + django_mongoengine/apps.py | 19 + django_mongoengine/document.py | 59 ++ django_mongoengine/fields/__init__.py | 35 ++ django_mongoengine/fields/djangoflavor.py | 296 +++++++++ django_mongoengine/forms/__init__.py | 2 + django_mongoengine/forms/document_options.py | 248 ++++++++ django_mongoengine/forms/documents.py | 362 +++++++++++ django_mongoengine/forms/fields.py | 128 ++++ django_mongoengine/forms/utils.py | 42 ++ django_mongoengine/forms/widgets.py | 415 +++++++++++++ django_mongoengine/mongo_admin/__init__.py | 14 + django_mongoengine/mongo_admin/actions.py | 105 ++++ django_mongoengine/mongo_admin/apps.py | 24 + django_mongoengine/mongo_admin/decorators.py | 28 + django_mongoengine/mongo_admin/helpers.py | 147 +++++ .../mongo_admin/management/__init__.py | 0 .../management/commands/__init__.py | 0 .../commands/createmongodbsuperuser.py | 140 +++++ django_mongoengine/mongo_admin/options.py | 569 ++++++++++++++++++ django_mongoengine/mongo_admin/sites.py | 33 + django_mongoengine/mongo_admin/static/dict.js | 329 ++++++++++ .../mongo_admin/static/helper.js | 64 ++ .../mongo_admin/static/jquery-1.8.0.min.js | 2 + .../templates/admin/change_document_list.html | 13 + .../templates/mongo_admin/index.html | 4 + .../mongo_admin/templatetags/__init__.py | 0 .../mongo_admin/templatetags/documenttags.py | 60 ++ .../templatetags/mongoadmintags.py | 33 + django_mongoengine/mongo_admin/util.py | 85 +++ django_mongoengine/mongo_admin/validation.py | 413 +++++++++++++ django_mongoengine/mongo_admin/views.py | 213 +++++++ django_mongoengine/mongo_auth/__init__.py | 0 django_mongoengine/mongo_auth/admin.py | 6 + django_mongoengine/mongo_auth/backends.py | 17 + django_mongoengine/mongo_auth/managers.py | 106 ++++ django_mongoengine/mongo_auth/models.py | 398 ++++++++++++ django_mongoengine/queryset.py | 102 ++++ django_mongoengine/sessions.py | 119 ++++ django_mongoengine/utils/__init__.py | 18 + django_mongoengine/utils/monkey.py | 13 + django_mongoengine/utils/patches.py | 18 + django_mongoengine/utils/wrappers.py | 26 + django_mongoengine/views/__init__.py | 13 + django_mongoengine/views/detail.py | 86 +++ django_mongoengine/views/edit.py | 68 +++ django_mongoengine/views/embedded.py | 115 ++++ django_mongoengine/views/list.py | 27 + .../views/templates/_forms.html | 21 + manage.py | 10 + primoprim/__init__.py | 0 primoprim/settings.py | 173 ++++++ primoprim/urls.py | 22 + primoprim/wsgi.py | 16 + somnium/__init__.py | 0 somnium/admin.py | 3 + somnium/apps.py | 5 + somnium/migrations/__init__.py | 0 somnium/models.py | 13 + somnium/static/somnium/images/background.jpg | Bin 0 -> 359047 bytes somnium/static/somnium/style.css | 9 + somnium/templates/admin/base_site.html | 9 + somnium/templates/somnium/index.html | 9 + somnium/tests.py | 17 + somnium/urls.py | 8 + somnium/views.py | 12 + 69 files changed, 5375 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 db.sqlite3 create mode 100644 django_mongoengine/__init__.py create mode 100644 django_mongoengine/apps.py create mode 100644 django_mongoengine/document.py create mode 100644 django_mongoengine/fields/__init__.py create mode 100644 django_mongoengine/fields/djangoflavor.py create mode 100644 django_mongoengine/forms/__init__.py create mode 100644 django_mongoengine/forms/document_options.py create mode 100644 django_mongoengine/forms/documents.py create mode 100644 django_mongoengine/forms/fields.py create mode 100644 django_mongoengine/forms/utils.py create mode 100644 django_mongoengine/forms/widgets.py create mode 100644 django_mongoengine/mongo_admin/__init__.py create mode 100644 django_mongoengine/mongo_admin/actions.py create mode 100644 django_mongoengine/mongo_admin/apps.py create mode 100644 django_mongoengine/mongo_admin/decorators.py create mode 100644 django_mongoengine/mongo_admin/helpers.py create mode 100644 django_mongoengine/mongo_admin/management/__init__.py create mode 100644 django_mongoengine/mongo_admin/management/commands/__init__.py create mode 100644 django_mongoengine/mongo_admin/management/commands/createmongodbsuperuser.py create mode 100644 django_mongoengine/mongo_admin/options.py create mode 100644 django_mongoengine/mongo_admin/sites.py create mode 100644 django_mongoengine/mongo_admin/static/dict.js create mode 100644 django_mongoengine/mongo_admin/static/helper.js create mode 100644 django_mongoengine/mongo_admin/static/jquery-1.8.0.min.js create mode 100644 django_mongoengine/mongo_admin/templates/admin/change_document_list.html create mode 100644 django_mongoengine/mongo_admin/templates/mongo_admin/index.html create mode 100644 django_mongoengine/mongo_admin/templatetags/__init__.py create mode 100644 django_mongoengine/mongo_admin/templatetags/documenttags.py create mode 100644 django_mongoengine/mongo_admin/templatetags/mongoadmintags.py create mode 100644 django_mongoengine/mongo_admin/util.py create mode 100644 django_mongoengine/mongo_admin/validation.py create mode 100644 django_mongoengine/mongo_admin/views.py create mode 100644 django_mongoengine/mongo_auth/__init__.py create mode 100644 django_mongoengine/mongo_auth/admin.py create mode 100644 django_mongoengine/mongo_auth/backends.py create mode 100644 django_mongoengine/mongo_auth/managers.py create mode 100644 django_mongoengine/mongo_auth/models.py create mode 100644 django_mongoengine/queryset.py create mode 100644 django_mongoengine/sessions.py create mode 100644 django_mongoengine/utils/__init__.py create mode 100644 django_mongoengine/utils/monkey.py create mode 100644 django_mongoengine/utils/patches.py create mode 100644 django_mongoengine/utils/wrappers.py create mode 100644 django_mongoengine/views/__init__.py create mode 100644 django_mongoengine/views/detail.py create mode 100644 django_mongoengine/views/edit.py create mode 100644 django_mongoengine/views/embedded.py create mode 100644 django_mongoengine/views/list.py create mode 100644 django_mongoengine/views/templates/_forms.html create mode 100755 manage.py create mode 100644 primoprim/__init__.py create mode 100644 primoprim/settings.py create mode 100644 primoprim/urls.py create mode 100644 primoprim/wsgi.py create mode 100644 somnium/__init__.py create mode 100644 somnium/admin.py create mode 100644 somnium/apps.py create mode 100644 somnium/migrations/__init__.py create mode 100644 somnium/models.py create mode 100644 somnium/static/somnium/images/background.jpg create mode 100644 somnium/static/somnium/style.css create mode 100644 somnium/templates/admin/base_site.html create mode 100644 somnium/templates/somnium/index.html create mode 100644 somnium/tests.py create mode 100644 somnium/urls.py create mode 100644 somnium/views.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8ddb271 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# JetBrains +.idea + +# Django +*.egg-info +*.pot +*.py[co] +.tox/ +__pycache__ +MANIFEST +dist/ +docs/_build/ +docs/locale/ +node_modules/ +tests/coverage_html/ +tests/.coverage +build/ +tests/report/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..81b2726 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# PrimoPrim — Somnium + +_A basic implementation of Django with MongoDB_ + +___ + +- Python 3.5.2 +- Django 1.9.1 +- PyMongo 3.4.0 +- MongoEngine 0.12.0 \ No newline at end of file diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..db0bcaef8ac0210bd8d057d76c3388a28f3061e5 GIT binary patch literal 143360 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 bD>}XC_W~}Gp4Fn{uWjuQAu`msrxpD__TXOz literal 0 HcmV?d00001 diff --git a/django_mongoengine/__init__.py b/django_mongoengine/__init__.py new file mode 100644 index 0000000..c6216b4 --- /dev/null +++ b/django_mongoengine/__init__.py @@ -0,0 +1,6 @@ +from .document import Document, DynamicDocument, EmbeddedDocument +from .queryset import QuerySet, QuerySetNoCache + +__all__ = ["QuerySet", "QuerySetNoCache", "Document", "DynamicDocument", "EmbeddedDocument"] + +default_app_config = 'django_mongoengine.apps.DjangoMongoEngineConfig' diff --git a/django_mongoengine/apps.py b/django_mongoengine/apps.py new file mode 100644 index 0000000..5b8d19a --- /dev/null +++ b/django_mongoengine/apps.py @@ -0,0 +1,19 @@ +from django.apps import AppConfig +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured + +from mongoengine import connection + + +class DjangoMongoEngineConfig(AppConfig): + """Simple AppConfig which does not do automatic discovery.""" + + name = 'django_mongoengine' + verbose_name = "Django-MongoEngine" + + def ready(self): + if not hasattr(settings, 'MONGODB_DATABASES'): + raise ImproperlyConfigured("Missing `MONGODB_DATABASES` in settings.py") + + for alias, conn_settings in settings.MONGODB_DATABASES.items(): + connection.register_connection(alias, **conn_settings) diff --git a/django_mongoengine/document.py b/django_mongoengine/document.py new file mode 100644 index 0000000..67efc1e --- /dev/null +++ b/django_mongoengine/document.py @@ -0,0 +1,59 @@ +from django.db.models import Model +from django.db.models.base import ModelState + +from mongoengine import document as me +from mongoengine.base import metaclasses as mtc + +from .utils.patches import serializable_value +from .forms.document_options import DocumentMetaWrapper +from .queryset import QuerySetManager + +def django_meta(meta, *top_bases): + class metaclass(meta): + def __new__(cls, name, bases, attrs): + change_bases = len(bases) == 1 and ( + bases[0].__name__ == "temporary_meta" + ) + if change_bases: + new_bases = top_bases + else: + new_bases = () + for b in bases: + if getattr(b, 'swap_base', False): + new_bases += top_bases + else: + new_bases += (b,) + new_cls = meta.__new__(cls, name, new_bases, attrs) + new_cls._meta = DocumentMetaWrapper(new_cls) + return new_cls + + return type.__new__(metaclass, 'temporary_meta', (), {}) + +class DjangoFlavor(object): + objects = QuerySetManager() + _default_manager = QuerySetManager() + serializable_value = serializable_value + _get_pk_val = Model.__dict__["_get_pk_val"] + + def __init__(self, *args, **kwargs): + self._state = ModelState(self._meta.get("db_alias", me.DEFAULT_CONNECTION_NAME)) + super(DjangoFlavor, self).__init__(*args, **kwargs) + + def _get_unique_checks(self, exclude=None): + # XXX: source: django/db/models/base.py + # used in modelform validation + unique_checks, date_checks = [], [] + return unique_checks, date_checks + + +class Document(django_meta(mtc.TopLevelDocumentMetaclass, + DjangoFlavor, me.Document)): + swap_base = True + +class DynamicDocument(django_meta(mtc.TopLevelDocumentMetaclass, + DjangoFlavor, me.DynamicDocument)): + swap_base = True + +class EmbeddedDocument(django_meta(mtc.DocumentMetaclass, + DjangoFlavor, me.EmbeddedDocument)): + swap_base = True diff --git a/django_mongoengine/fields/__init__.py b/django_mongoengine/fields/__init__.py new file mode 100644 index 0000000..70f8753 --- /dev/null +++ b/django_mongoengine/fields/__init__.py @@ -0,0 +1,35 @@ +from . import djangoflavor + +def init_module(): + """ + Create classes with Django-flavor mixins, + use DjangoField mixin as default + """ + import sys + from mongoengine import fields + current_module = sys.modules[__name__] + current_module.__all__ = fields.__all__ + + for name in fields.__all__: + fieldcls = getattr(fields, name) + mixin = getattr(djangoflavor, name, djangoflavor.DjangoField) + setattr( + current_module, name, + type(name, (mixin, fieldcls), {}) + ) +init_module() + +def patch_mongoengine_field(field_name): + """ + patch mongoengine.[field_name] for comparison support + becouse it's required in django.forms.models.fields_for_model + importing using mongoengine internal import cache + """ + from mongoengine import common + field = common._import_class(field_name) + for k in ["__eq__", "__lt__", "__hash__", "attname"]: + if not k in field.__dict__: + setattr(field, k, djangoflavor.DjangoField.__dict__[k]) + +for f in ["StringField", "ObjectIdField"]: + patch_mongoengine_field(f) diff --git a/django_mongoengine/fields/djangoflavor.py b/django_mongoengine/fields/djangoflavor.py new file mode 100644 index 0000000..2cf1043 --- /dev/null +++ b/django_mongoengine/fields/djangoflavor.py @@ -0,0 +1,296 @@ +from django.utils.text import capfirst +from django.core.validators import RegexValidator +from django import forms +from django.db.models import Field +from django.utils.functional import cached_property + +from mongoengine import fields + +from django_mongoengine.forms import fields as formfields + +_field_defaults = ( + ("editable", True), + ("blank", False), + ("null", False), + ("verbose_name", None), + ("help_text", None), + ("auto_created", False), +) + +class DjangoField(object): + + get_choices = Field.__dict__["get_choices"] + + def __init__(self, *args, **kwargs): + for k, v in _field_defaults: + kwargs.setdefault(k, v) + kwargs["required"] = not kwargs["blank"] + super(DjangoField, self).__init__(*args, **kwargs) + if self.verbose_name is None and self.name: + self.verbose_name = self.name.replace('_', ' ') + + def formfield(self, form_class=None, choices_form_class=None, **kwargs): + """ + Returns a django.forms.Field instance for this database Field. + """ + defaults = {'required': self.required, + 'label': capfirst(self.verbose_name), + 'help_text': self.help_text} + if self.default: + if callable(self.default): + defaults['initial'] = self.default + defaults['show_hidden_initial'] = True + else: + defaults['initial'] = self.default + if self.choices: + # Fields with choices get special treatment. + include_blank = (self.blank or + not (self.default or 'initial' in kwargs)) + defaults['choices'] = self.get_choices(include_blank=include_blank) + defaults['coerce'] = self.to_python + if self.null: + defaults['empty_value'] = None + if choices_form_class is not None: + form_class = choices_form_class + else: + form_class = forms.TypedChoiceField + # Many of the subclass-specific formfield arguments (min_value, + # max_value) don't apply for choice fields, so be sure to only pass + # the values that TypedChoiceField will understand. + for k in list(kwargs): + if k not in ('coerce', 'empty_value', 'choices', 'required', + 'widget', 'label', 'initial', 'help_text', + 'error_messages', 'show_hidden_initial'): + del kwargs[k] + defaults.update(kwargs) + if form_class is None: + form_class = forms.CharField + return form_class(**defaults) + + + def save_form_data(self, instance, data): + setattr(instance, self.name, data) + + def value_from_object(self, obj): + return getattr(obj, self.name) + + @cached_property + def attname(self): + return self.db_field + + def __eq__(self, other): + # Needed for @total_ordering + if isinstance(other, fields.BaseField): + return self.creation_counter == other.creation_counter + return NotImplemented + + def __lt__(self, other): + # This is needed because bisect does not take a comparison function. + if isinstance(other, fields.BaseField): + return self.creation_counter < other.creation_counter + return NotImplemented + + def __hash__(self): + return hash(self.creation_counter) + + +class StringField(DjangoField): + + def formfield(self, form_class=forms.CharField, choices_form_class=None, **kwargs): + + defaults = {} + + if self.max_length and not self.choices: + defaults['max_length'] = self.max_length + + if self.max_length is None and not self.choices: + defaults['widget'] = forms.Textarea + + if self.regex: + defaults['regex'] = self.regex + + defaults.update(kwargs) + return super(StringField, self).formfield(form_class, choices_form_class, **defaults) + + +class EmailField(StringField): + + def __init__(self, *args, **kwargs): + # max_length=254 to be compliant with RFCs 3696 and 5321 + kwargs['max_length'] = kwargs.get('max_length', 254) + super(EmailField, self).__init__(*args, **kwargs) + + def formfield(self, **kwargs): + defaults = { + 'form_class': forms.EmailField, + } + defaults.update(kwargs) + return super(EmailField, self).formfield(**defaults) + + +class URLField(StringField): + + def formfield(self, **kwargs): + defaults = { + 'form_class': forms.URLField, + } + defaults.update(kwargs) + return super(URLField, self).formfield(**defaults) + + +class MinMaxMixin(object): + + def formfield(self, **kwargs): + defaults = { + 'min_value': self.min_value, + 'max_value': self.max_value, + } + defaults.update(kwargs) + return super(MinMaxMixin, self).formfield(**defaults) + + +class IntField(MinMaxMixin, DjangoField): + + def formfield(self, **kwargs): + defaults = { + 'form_class': forms.IntegerField, + } + defaults.update(kwargs) + return super(IntField, self).formfield(**defaults) + + +class FloatField(MinMaxMixin, DjangoField): + + def formfield(self, **kwargs): + defaults = { + 'form_class': forms.FloatField, + } + defaults.update(kwargs) + return super(FloatField, self).formfield(**defaults) + + +class DecimalField(MinMaxMixin, DjangoField): + + def formfield(self, **kwargs): + defaults = { + 'max_digits': self.max_digits, + 'decimal_places': self.precision, + 'form_class': forms.DecimalField, + } + defaults.update(kwargs) + return super(DecimalField, self).formfield(**defaults) + +# TODO: test boolean choices; test choices + +class BooleanField(DjangoField): + + def formfield(self, **kwargs): + # Unlike most fields, BooleanField figures out include_blank from + # self.null instead of self.blank. + if self.choices: + include_blank = not (self.default or 'initial' in kwargs) + defaults = {'choices': self.get_choices(include_blank=include_blank)} + else: + defaults = {'form_class': forms.BooleanField} + defaults.update(kwargs) + return super(BooleanField, self).formfield(**defaults) + + +class DateTimeField(DjangoField): + + def formfield(self, **kwargs): + defaults = {'form_class': forms.DateTimeField} + defaults.update(kwargs) + return super(DateTimeField, self).formfield(**defaults) + + +class ReferenceField(DjangoField): + + def formfield(self, **kwargs): + defaults = { + 'form_class': formfields.ReferenceField, + 'queryset': self.document_type.objects, + } + defaults.update(kwargs) + return super(ReferenceField, self).formfield(**defaults) + + +# TODO: test field.field.choices? +class ListField(DjangoField): + + def formfield(self, **kwargs): + if self.field.choices: + defaults = { + 'choices': self.field.choices, + 'widget': forms.CheckboxSelectMultiple, + 'form_class': forms.MultipleChoiceField, + } + elif isinstance(self.field, fields.ReferenceField): + defaults = { + 'form_class': formfields.DocumentMultipleChoiceField, + 'queryset': self.field.document_type.objects, + } + else: + return None + defaults.update(kwargs) + return super(ListField, self).formfield(**defaults) + + +class FileField(DjangoField): + + + def __init__(self, *args, **kwargs): + + kwargs['max_length'] = kwargs.get('max_length', 100) + super(FileField, self).__init__(*args, **kwargs) + + def formfield(self, **kwargs): + defaults = {'form_class': forms.FileField, 'max_length': self.max_length} + # If a file has been provided previously, then the form doesn't require + # that a new file is provided this time. + # The code to mark the form field as not required is used by + # form_for_instance, but can probably be removed once form_for_instance + # is gone. ModelForm uses a different method to check for an existing file. + if 'initial' in kwargs: + defaults['required'] = False + defaults.update(kwargs) + return super(FileField, self).formfield(**defaults) + + +class ImageField(FileField): + + def formfield(self, **kwargs): + defaults = {'form_class': forms.ImageField} + defaults.update(kwargs) + return super(ImageField, self).formfield(**defaults) + + +class DictField(DjangoField): + + def formfield(self, **kwargs): + #remove Mongo reserved words + validators = [ + RegexValidator( + regex='^[^$_]', + message=u'Ensure the keys do not begin with : ["$","_"].', code='invalid_start' + ) + ] + defaults = { + 'validators': validators, + 'form_class': formfields.DictField, + } + return super(DictField, self).formfield(**defaults) + + +class EmbeddedDocumentField(DjangoField): + + def formfield(self, **kwargs): + from django_mongoengine.forms.documents import documentform_factory + defaults = { + 'label': self.label, + 'help_text': self.help_text, + } + form_class = EmbeddedDocumentField + defaults.update(kwargs) + form = form_class(documentform_factory(self.document_type), **defaults) + return form diff --git a/django_mongoengine/forms/__init__.py b/django_mongoengine/forms/__init__.py new file mode 100644 index 0000000..7f9df9c --- /dev/null +++ b/django_mongoengine/forms/__init__.py @@ -0,0 +1,2 @@ +from .documents import * +from .utils import * diff --git a/django_mongoengine/forms/document_options.py b/django_mongoengine/forms/document_options.py new file mode 100644 index 0000000..42081b1 --- /dev/null +++ b/django_mongoengine/forms/document_options.py @@ -0,0 +1,248 @@ +import sys +import warnings + +from django.db.models.fields import FieldDoesNotExist +from django.utils.text import capfirst +from django.utils.encoding import smart_text + +try: + from django.db.models.options import get_verbose_name +except ImportError: + from django.utils.text import camel_case_to_spaces as get_verbose_name + + +from mongoengine.fields import ReferenceField + + +class PkWrapper(object): + """Used to wrap the Primary Key so it can mimic Django's expectations + """ + editable = False + remote_field = None + + def __init__(self, wrapped): + self.obj = wrapped + + def __getattr__(self, attr): + if attr in dir(self.obj): + return getattr(self.obj, attr) + raise AttributeError("{} has no {}".format(self, attr)) + + def __setattr__(self, attr, value): + if attr != 'obj' and hasattr(self.obj, attr): + setattr(self.obj, attr, value) + super(PkWrapper, self).__setattr__(attr, value) + + def value_to_string(self, obj): + """ + Returns a string value of this field from the passed obj. + This is used by the serialization framework. + """ + return smart_text(obj.pk) + + +class DocumentMetaWrapper(object): + """ + Used to store mongoengine's _meta dict to make the document admin + as compatible as possible to django's meta class on models. + """ + _pk = None + pk_name = None + app_label = None + model_name = None + verbose_name = None + has_auto_field = False + object_name = None + proxy = [] + virtual_fields = [] + concrete_fields = [] + proxied_children = [] + parents = {} + private_fields = [] + many_to_many = [] + swapped = False + _field_cache = None + document = None + _meta = None + + def __init__(self, document): + if isinstance(document._meta, DocumentMetaWrapper): + meta = document._meta._meta + else: + meta = document._meta + self.document = document + self._meta = meta or {} + self.model = document + self.concrete_model = document + self.concrete_fields = document._fields.values() + self.fields = self.concrete_fields + + try: + self.object_name = self.document.__name__ + except AttributeError: + self.object_name = self.document.__class__.__name__ + + self.model_name = self.object_name.lower() + self.app_label = self.get_app_label() + self.verbose_name = self.get_verbose_name() + + # EmbeddedDocuments don't have an id field. + try: + self.pk_name = self._meta['id_field'] + self._init_pk() + except KeyError: + pass + + @property + def module_name(self): + """ + This property has been deprecated in favor of `model_name`. + """ + warnings.warn( + "Options.module_name has been deprecated in favor of model_name", + PendingDeprecationWarning, stacklevel=2) + return self.model_name + + def get_app_label(self): + model_module = sys.modules[self.document.__module__] + return model_module.__name__.split('.')[-2] + + def get_verbose_name(self): + """ + Returns the verbose name of the document. + + Checks the original meta dict first. If it is not found + then generates a verbose name from from the object name. + """ + try: + return capfirst(get_verbose_name(self._meta['verbose_name'])) + except KeyError: + return capfirst(get_verbose_name(self.object_name)) + + @property + def verbose_name_raw(self): + return self.verbose_name + + @property + def verbose_name_plural(self): + return "%ss" % self.verbose_name + + @property + def pk(self): + if not hasattr(self._pk, 'attname'): + self._init_pk() + return self._pk + + def get_fields(self, include_parents=True, include_hidden=False): + # XXX: simple placeholder; TODO: handle options; + return self.concrete_fields + + def _init_pk(self): + """ + Adds a wrapper around the documents pk field. The wrapper object gets the attributes + django expects on the pk field, like name and attname. + + The function also adds a _get_pk_val method to the document. + """ + if self.id_field is None: + return + + try: + pk_field = getattr(self.document, self.id_field) + self._pk = PkWrapper(pk_field) + self._pk.name = self.id_field + self._pk.attname = self.id_field + except AttributeError: + return + + def get_add_permission(self): + return 'add_%s' % self.object_name.lower() + + def get_change_permission(self): + return 'change_%s' % self.object_name.lower() + + def get_delete_permission(self): + return 'delete_%s' % self.object_name.lower() + + def get_ordered_objects(self): + return [] + + def get_field_by_name(self, name): + """ + Returns the (field_object, model, direct, m2m), where field_object is + the Field instance for the given name, model is the model containing + this field (None for local fields), direct is True if the field exists + on this model, and m2m is True for many-to-many relations. When + 'direct' is False, 'field_object' is the corresponding RelatedObject + for this field (since the field doesn't have an instance associated + with it). + + Uses a cache internally, so after the first access, this is very fast. + """ + try: + try: + return self._field_cache[name] + except TypeError: + self._init_field_cache() + return self._field_cache[name] + except KeyError: + raise FieldDoesNotExist('%s has no field named %r' + % (self.object_name, name)) + + def _init_field_cache(self): + if self._field_cache is None: + self._field_cache = {} + + for f in self.document._fields.values(): + if isinstance(f, ReferenceField): + document = f.document_type + self._field_cache[document._meta.module_name] = (f, document, False, False) + else: + self._field_cache[f.name] = (f, None, True, False) + + return self._field_cache + + def get_field(self, name, many_to_many=True): + """ + Returns the requested field by name. Raises FieldDoesNotExist on error. + """ + return self.get_field_by_name(name)[0] + + def __getattr__(self, name): + try: + return self._meta[name] + except KeyError as e: + raise AttributeError(*e.args) + + def __setattr__(self, name, value): + if not hasattr(self, name): + self._meta[name] = value + else: + super(DocumentMetaWrapper, self).__setattr__(name, value) + + def __getitem__(self, key): + return self._meta[key] + + def __setitem__(self, key, value): + self._meta[key] = value + + def __contains__(self, key): + return key in self._meta + + def get(self, key, default=None): + try: + return self.__getitem__(key) + except KeyError: + return default + + def get_parent_list(self): + return [] + + def get_all_related_objects(self, *args, **kwargs): + return [] + + def iteritems(self): + return self._meta.iteritems() + + def items(self): + return self._meta.items() diff --git a/django_mongoengine/forms/documents.py b/django_mongoengine/forms/documents.py new file mode 100644 index 0000000..4e1a316 --- /dev/null +++ b/django_mongoengine/forms/documents.py @@ -0,0 +1,362 @@ +from functools import partial + +from django.forms.forms import DeclarativeFieldsMetaclass +from django.forms.models import ALL_FIELDS +from django.core.exceptions import FieldError, ImproperlyConfigured +from django.forms import models as model_forms +from django.utils import six + +from mongoengine.fields import ObjectIdField, FileField +from mongoengine.errors import ValidationError + + +def construct_instance(form, instance, fields=None, exclude=None): + """ + Constructs and returns a model instance from the bound ``form``'s + ``cleaned_data``, but does not save the returned instance to the + database. + """ + opts = instance._meta + + cleaned_data = form.cleaned_data + file_field_list = [] + for f in opts.fields: + try: + if not f.editable or isinstance(f, ObjectIdField) or f.name not in cleaned_data: + continue + except AttributeError: + # probably this is StringField() added automatically for inherited fields + # so we ignore it + continue + if fields is not None and f.name not in fields: + continue + if exclude and f.name in exclude: + continue + # Defer saving file-type fields until after the other fields, so a + # callable upload_to can use the values from other fields. + if isinstance(f, FileField): + file_field_list.append(f) + else: + f.save_form_data(instance, cleaned_data[f.name]) + + for f in file_field_list: + f.save_form_data(instance, cleaned_data[f.name]) + + return instance + + + +def save_instance(form, instance, fields=None, fail_message='saved', + commit=True, exclude=None, construct=True): + """ + Saves bound Form ``form``'s cleaned_data into document instance ``instance``. + + If commit=True, then the changes to ``instance`` will be saved to the + database. Returns ``instance``. + + If construct=False, assume ``instance`` has already been constructed and + just needs to be saved. + """ + instance = construct_instance(form, instance, fields, exclude) + if form.errors: + raise ValueError("The %s could not be %s because the data didn't" + " validate." % (instance.__class__.__name__, + fail_message)) + + if commit and hasattr(instance, 'save'): + # see BaseDocumentForm._post_clean for an explanation + if hasattr(form, '_delete_before_save'): + fields = instance._fields + new_fields = dict([(n, f) for n, f in six.iteritems(fields) + if not n in form._delete_before_save]) + if hasattr(instance, '_changed_fields'): + for field in form._delete_before_save: + instance._changed_fields.remove(field) + instance._fields = new_fields + instance.save() + instance._fields = fields + else: + instance.save() + + return instance + + + +class DocumentFormOptions(model_forms.ModelFormOptions): + def __init__(self, options=None): + super(DocumentFormOptions, self).__init__(options) + self.model = getattr(options, 'document', None) or getattr(options, 'model', None) + if self.model is not None: + options.model = self.model + self.embedded_field = getattr(options, 'embedded_field', None) + + +class DocumentFormMetaclass(DeclarativeFieldsMetaclass): + def __new__(mcs, name, bases, attrs): + formfield_callback = attrs.pop('formfield_callback', None) + + new_class = super(DocumentFormMetaclass, mcs).__new__(mcs, name, bases, attrs) + + if bases == (BaseDocumentForm,): + return new_class + + opts = new_class._meta = DocumentFormOptions(getattr(new_class, 'Meta', None)) + + # We check if a string was passed to `fields` or `exclude`, + # which is likely to be a mistake where the user typed ('foo') instead + # of ('foo',) + for opt in ['fields', 'exclude', 'localized_fields']: + value = getattr(opts, opt) + if isinstance(value, six.string_types) and value != ALL_FIELDS: + msg = ("%(model)s.Meta.%(opt)s cannot be a string. " + "Did you mean to type: ('%(value)s',)?" % { + 'model': new_class.__name__, + 'opt': opt, + 'value': value, + }) + raise TypeError(msg) + + if opts.model: + # If a model is defined, extract form fields from it. + if opts.fields is None and opts.exclude is None: + raise ImproperlyConfigured( + "Creating a ModelForm without either the 'fields' attribute " + "or the 'exclude' attribute is prohibited; form %s " + "needs updating." % name + ) + + if opts.fields == ALL_FIELDS: + # Sentinel for fields_for_model to indicate "get the list of + # fields from the model" + opts.fields = None + + fields = model_forms.fields_for_model( + opts.model, opts.fields, opts.exclude, + opts.widgets, formfield_callback, + opts.localized_fields, opts.labels, + opts.help_texts, opts.error_messages, + opts.field_classes, + ) + + # make sure opts.fields doesn't specify an invalid field + none_model_fields = [k for k, v in six.iteritems(fields) if not v] + missing_fields = (set(none_model_fields) - + set(new_class.declared_fields.keys())) + if missing_fields: + message = 'Unknown field(s) (%s) specified for %s' + message = message % (', '.join(missing_fields), + opts.model.__name__) + raise FieldError(message) + # Override default model fields with any custom declared ones + # (plus, include all the other declared fields). + fields.update(new_class.declared_fields) + else: + fields = new_class.declared_fields + + new_class.base_fields = fields + + return new_class + + +class BaseDocumentForm(model_forms.BaseModelForm): + + def _save_m2m(self): + pass + + def _post_clean(self): + opts = self._meta + + # mongo MetaDict does not have fields attribute + # adding it here istead of rewriting code + self.instance._meta.fields = opts.model._meta.fields + exclude = self._get_validation_exclusions() + + try: + self.instance = construct_instance(self, self.instance, opts.fields, exclude) + except ValidationError as e: + self._update_errors(e) + + def save(self, commit=True): + """ + Saves this ``form``'s cleaned_data into model instance + ``self.instance``. + + If commit=True, then the changes to ``instance`` will be saved to the + database. Returns ``instance``. + """ + + if self.errors: + try: + if self.instance.pk is None: + fail_message = 'created' + else: + fail_message = 'changed' + except (KeyError, AttributeError): + fail_message = 'embedded document saved' + raise ValueError( + "The %s could not be %s because the data didn't" + " validate." % (self.instance.__class__.__name__, fail_message)) + + if commit: + self.instance.save() + else: + self.save_m2m = self._save_m2m + + return self.instance + save.alters_data = True + + +@six.add_metaclass(DocumentFormMetaclass) +class DocumentForm(BaseDocumentForm): + pass + + +documentform_factory = partial(model_forms.modelform_factory, form=DocumentForm) + + +@six.add_metaclass(DocumentFormMetaclass) +class EmbeddedDocumentForm(BaseDocumentForm): + + def __init__(self, parent_document, *args, **kwargs): + super(EmbeddedDocumentForm, self).__init__(*args, **kwargs) + self.parent_document = parent_document + if self._meta.embedded_field is None: + raise FieldError("%s.Meta must have defined embedded_field" % self.__class__.__name__) + if not hasattr(self.parent_document, self._meta.embedded_field): + raise FieldError("Parent document must have field %s" % self._meta.embedded_field) + + def save(self, commit=True): + if self.errors: + raise ValueError( + "The %s could not be saved because the data didn't" + " validate." % self.instance.__class__.__name__ + ) + + def save(*args, **kwargs): + instance = construct_instance(self, self.instance, self.fields, self._meta.exclude) + l = getattr(self.parent_document, self._meta.embedded_field) + l.append(instance) + setattr(self.parent_document, self._meta.embedded_field, l) + self.parent_document.save(*args, **kwargs) + if commit: + save() + else: + self.instance.save = save + + return self.instance + + +class BaseDocumentFormSet(model_forms.BaseModelFormSet): + """ + A ``FormSet`` for editing a queryset and/or adding new objects to it. + """ + + +documentformset_factory = partial( + model_forms.modelformset_factory, + form=DocumentForm, formset=BaseDocumentFormSet, +) + + +class BaseInlineDocumentFormSet(BaseDocumentFormSet): + """ + A formset for child objects related to a parent. + + self.instance -> the document containing the inline objects + """ + def __init__(self, data=None, files=None, instance=None, + save_as_new=False, prefix=None, queryset=[], **kwargs): + self.instance = instance + self.save_as_new = save_as_new + + super(BaseInlineDocumentFormSet, self).__init__(data, files, prefix=prefix, queryset=queryset, **kwargs) + + def initial_form_count(self): + if self.save_as_new: + return 0 + return super(BaseInlineDocumentFormSet, self).initial_form_count() + + #@classmethod + def get_default_prefix(cls): + return cls.model.__name__.lower() + get_default_prefix = classmethod(get_default_prefix) + + def add_fields(self, form, index): + super(BaseInlineDocumentFormSet, self).add_fields(form, index) + + # Add the generated field to form._meta.fields if it's defined to make + # sure validation isn't skipped on that field. + if form._meta.fields: + if isinstance(form._meta.fields, tuple): + form._meta.fields = list(form._meta.fields) + #form._meta.fields.append(self.fk.name) + + def get_unique_error_message(self, unique_check): + unique_check = [field for field in unique_check if field != self.fk.name] + return super(BaseInlineDocumentFormSet, self).get_unique_error_message(unique_check) + + +def inlineformset_factory(document, form=DocumentForm, + formset=BaseInlineDocumentFormSet, + fields=None, exclude=None, + extra=1, can_order=False, can_delete=True, max_num=None, + formfield_callback=None): + """ + Returns an ``InlineFormSet`` for the given kwargs. + + You must provide ``fk_name`` if ``model`` has more than one ``ForeignKey`` + to ``parent_model``. + """ + kwargs = { + 'form': form, + 'formfield_callback': formfield_callback, + 'formset': formset, + 'extra': extra, + 'can_delete': can_delete, + 'can_order': can_order, + 'fields': fields, + 'exclude': exclude, + 'max_num': max_num, + } + FormSet = documentformset_factory(document, **kwargs) + return FormSet + + +class EmbeddedDocumentFormSet(BaseInlineDocumentFormSet): + def __init__(self, parent_document=None, data=None, files=None, instance=None, + save_as_new=False, prefix=None, queryset=[], **kwargs): + self.parent_document = parent_document + super(EmbeddedDocumentFormSet, self).__init__(data, files, instance, save_as_new, prefix, queryset, **kwargs) + + def _construct_form(self, i, **kwargs): + defaults = {'parent_document': self.parent_document} + defaults.update(kwargs) + form = super(BaseDocumentFormSet, self)._construct_form(i, **defaults) + return form + + +def embeddedformset_factory(document, parent_document, form=EmbeddedDocumentForm, + formset=EmbeddedDocumentFormSet, + fields=None, exclude=None, + extra=1, can_order=False, can_delete=True, max_num=None, + formfield_callback=None): + """ + Returns an ``InlineFormSet`` for the given kwargs. + + You must provide ``fk_name`` if ``model`` has more than one ``ForeignKey`` + to ``parent_model``. + """ + kwargs = { + 'form': form, + 'formfield_callback': formfield_callback, + 'formset': formset, + 'extra': extra, + 'can_delete': can_delete, + 'can_order': can_order, + 'fields': fields, + 'exclude': exclude, + 'max_num': max_num, + } + FormSet = inlineformset_factory(document, **kwargs) + FormSet.parent_document = parent_document + return FormSet diff --git a/django_mongoengine/forms/fields.py b/django_mongoengine/forms/fields.py new file mode 100644 index 0000000..37ac844 --- /dev/null +++ b/django_mongoengine/forms/fields.py @@ -0,0 +1,128 @@ +from django import forms +from django.core.exceptions import ValidationError +from django.utils.translation import ugettext_lazy as _ + +from django_mongoengine.forms.widgets import Dictionary, EmbeddedFieldWidget + + +class ReferenceField(forms.ModelChoiceField): + pass + +class DocumentMultipleChoiceField(forms.ModelMultipleChoiceField): + pass + + +class DictField(forms.Field): + """ + DictField for mongo forms + """ + + error_messages = { + 'length': _(u'Ensure the keys length is less than or equal to %s.'), + 'invalid_key': _(u'Ensure the keys are not : %s.'), + 'illegal': _(u'Ensure the keys does not contain any illegal character : %s.'), + 'depth': _(u'Ensure the dictionary depth is less than or equal to %s.') + } + + #Mongo reserved keywords + invalid_keys = ['err', 'errmsg'] + #Mongo prohibit . in keys + illegal_characters = ['.'] + #limit key length for efficiency + key_limit = 200 + #limit depth for dictionaries + max_depth = None + + def __init__(self, max_depth=None, flags=None, sub_attrs=None, attrs=None, *args, **kwargs): + if 'error_messages' in kwargs.keys(): + kwargs['error_messages'].update(self.error_messages) + else: + kwargs['error_messages'] = self.error_messages + + self.max_depth = (max_depth if max_depth and max_depth >= 0 else None) + + if 'widget' not in kwargs.keys(): + schema = None + #Here it needs to be clearer, because this is only useful when creating an object, + #if no default value is provided, default is callable + if 'initial' in kwargs and not callable(kwargs['initial']): + if isinstance(kwargs['initial'], dict): + schema = kwargs['initial'] + + #here if other parameters are passed, like max_depth and flags, then we hand them to the dict + kwargs['widget'] = Dictionary(max_depth=max_depth, flags=flags, schema=schema, sub_attrs=sub_attrs) + + super(DictField, self).__init__(*args, **kwargs) + + def prepare_value(self, value): + return value + + def to_python(self, value): + value = self.get_dict(value) + return value + + def clean(self, value): + self.max_depth = self.widget.max_depth + value = self.to_python(value) + self.validate(value) + return value + + def get_dict(self, a_list): + """ + A function that return a dictionary from a list of lists, with any depth + """ + d = {} + for k in a_list: + if (isinstance(k, list)): + if isinstance(k[1], list) and k[0]: + d.update({k[0]: self.get_dict(k[1])}) + elif k[0]: + d.update({k[0]: k[1]}) + return d + + def validate(self, value, depth=0): + #we should not use the super.validate method + if self.max_depth is not None and depth > self.max_depth: + raise ValidationError(self.error_messages['depth'] % self.max_depth) + for k, v in value.items(): + self.run_validators(k) + if k in self.invalid_keys: + raise ValidationError(self.error_messages['invalid_key'] % self.invalid_keys) + if len(k) > self.key_limit: + raise ValidationError(self.error_messages['length'] % self.key_limit) + for u in self.illegal_characters: + if u in k: + raise ValidationError(self.error_messages['illegal'] % self.illegal_characters) + if isinstance(v, dict): + self.validate(v, depth + 1) + +class EmbeddedDocumentField(forms.MultiValueField): + def __init__(self, form, *args, **kwargs): + self.form = form() + # Set the widget and initial data + kwargs['widget'] = EmbeddedFieldWidget(self.form.fields) + kwargs['initial'] = [f.initial for f in self.form.fields.values()] + kwargs['require_all_fields'] = False + super(EmbeddedDocumentField, self).__init__(fields=tuple([f for f in self.form.fields.values()]), *args, **kwargs) + + def bound_data(self, data, initial): + return data + + def prepare_value(self, value): + return value + def compress(self, data_list): + data = {} + if data_list: + data = dict((f.name, data_list[i]) for i, f in enumerate(self.form)) + f = self.form.__class__(data) + f.is_valid() + return f.cleaned_data + return data + + def clean(self, value): + return self.to_python(super(EmbeddedDocumentField, self).clean(value)) + + def to_python(self, value): + obj = self.form._meta.model() + [ obj.__setattr__(k, value[k]) for k in value.keys() ] + return obj diff --git a/django_mongoengine/forms/utils.py b/django_mongoengine/forms/utils.py new file mode 100644 index 0000000..6dbb47c --- /dev/null +++ b/django_mongoengine/forms/utils.py @@ -0,0 +1,42 @@ +from collections import OrderedDict +from functools import partial + +from django.forms.fields import Field +from django.utils import six + + +def patch_document(function, instance): + setattr(instance, function.__name__, partial(function, instance)) + + +def get_declared_fields(bases, attrs, with_base_fields=True): + """ + Create a list of form field instances from the passed in 'attrs', plus any + similar fields on the base classes (in 'bases'). This is used by both the + Form and ModelForm metaclasses. + + If 'with_base_fields' is True, all fields from the bases are used. + Otherwise, only fields in the 'declared_fields' attribute on the bases are + used. The distinction is useful in ModelForm subclassing. + Also integrates any additional media definitions. + """ + + fields = [ + (field_name, attrs.pop(field_name)) + for field_name, obj in list(six.iteritems(attrs)) if isinstance(obj, Field) + ] + fields.sort(key=lambda x: x[1].creation_counter) + + # If this class is subclassing another Form, add that Form's fields. + # Note that we loop over the bases in *reverse*. This is necessary in + # order to preserve the correct order of fields. + if with_base_fields: + for base in bases[::-1]: + if hasattr(base, 'base_fields'): + fields = list(six.iteritems(base.base_fields)) + fields + else: + for base in bases[::-1]: + if hasattr(base, 'declared_fields'): + fields = list(six.iteritems(base.declared_fields)) + fields + + return OrderedDict(fields) diff --git a/django_mongoengine/forms/widgets.py b/django_mongoengine/forms/widgets.py new file mode 100644 index 0000000..41e8520 --- /dev/null +++ b/django_mongoengine/forms/widgets.py @@ -0,0 +1,415 @@ +import re + +from django.forms.widgets import TextInput, HiddenInput, MultiWidget, Media +from django.utils.safestring import mark_safe + +from django_mongoengine.utils import OrderedDict + +# The list of JavaScript files to insert to render any Dictionary widget +MEDIAS = ('jquery-1.8.0.min.js', 'dict.js', 'helper.js') +ADD_FIELD_VERBOSE = 'Add Field' +ADD_DICT_VERBOSE = ' - Add subdictionary' + + +class Dictionary(MultiWidget): + """ + A widget representing a dictionary field + """ + + def __init__(self, schema=None, no_schema=1, max_depth=None, + flags=None, sub_attrs=None, attrs=None, verbose_dict=None, + verbose_field=None): + """ + :param schema: A dictionary representing the future schema of + the Dictionary widget. It is responsible for the + creation of subwidgets. + :param no_schema: An integer that can take 3 values : 0,1,2. + 0 means that no schema was passed. + 1 means that the schema passed was the default + one. This is the default value. + 2 means that the schema passed was given + by a parent widget, and that it actually + represent data for rendering. + 3 means that the schema was rebuilt after + retrieving form data. + :param max_depth: An integer representing the max depth of + sub-dicts. If passed, the system will + prevent to save dictionaries with depths + superior to this parameter. + :param flags: A list of flags. Available values : + - 'FORCE_SCHEMA' : would force dictionaries + to keep a certain schema. Only Pair fields + could be added. + :param sub_attrs: A dictionary that contains the classes + for the keys (key.class) and the values + (value.class) of each pair + :param verbose_field: verbose for 'Add field' + :param verbose_dict: verbose for 'Add dict' + """ + self.verbose_field = verbose_field or ADD_FIELD_VERBOSE + self.verbose_dict = verbose_dict or ADD_DICT_VERBOSE + self.no_schema = no_schema + self.max_depth = (max_depth if max_depth and max_depth >= 0 else None) + self.flags = flags or [] + self.sub_attrs = sub_attrs or {} + + if flags is not None and 'FORCE_SCHEMA' in flags: + self.pair = StaticPair + self.subdict = StaticSubDictionary + else: + self.pair = Pair + self.subdict = SubDictionary + + widget_object = [] + if isinstance(schema, dict) and self.no_schema > 0: + for key in schema: + if isinstance(schema[key], dict): + widget_object.append(self.subdict(key_value=key, schema=schema[key], + max_depth=max_depth, sub_attrs=self.sub_attrs, + attrs=attrs, verbose_field=self.verbose_field, + verbose_dict=self.verbose_dict)) + else: + widget_object.append(self.pair(key_value=key, sub_attrs=self.sub_attrs, attrs=attrs)) + else: + widget_object.append(self.pair(sub_attrs=self.sub_attrs, sattrs=attrs)) + + super(Dictionary, self).__init__(widget_object, attrs) + + def decompress(self, value): + if value and isinstance(value, dict): + value = self.dict_sort(value) + value = list(value.items()) + + # If the schema in place wasn't passed by a parent widget + # we need to rebuild it + if self.no_schema < 2: + self.update_widgets(value, erase=True) + return value + else: + return [] + + def render(self, name, value, attrs=None): + if not isinstance(value, list): + value = self.decompress(value) + if self.is_localized: + for widget in self.widgets: + widget.is_localized = self.is_localized + output = [] + final_attrs = self.build_attrs(attrs) + id_ = final_attrs.get('id') + for i, widget in enumerate(self.widgets): + try: + widget_value = value[i] + except IndexError: + widget_value = None + suffix = widget.suffix + if id_: + final_attrs = dict(final_attrs, id='%s_%s_%s' % + (id_, i, suffix)) + output.append(widget.render('%s_%s_%s' % (name, i, suffix), + widget_value, + final_attrs)) + return mark_safe(self.format_output(name, output)) + + def value_from_datadict(self, data, files, name): + """ + Process is: + - erase every widget ; + - create the new ones from the data dictionary + + It would take into account every modification on the structure, and + make form repopulation automatic + """ + data_keys = data.keys() + self.widgets = [] + html_indexes = [] + prefix = 'st' if self.flags is not None and 'FORCE_SCHEMA' in self.flags else '' + for data_key in data_keys: + match = re.match(name + '_(\d+)_%spair_0' % prefix, data_key) + if match is not None: + self.widgets.append(self.pair(sub_attrs=self.sub_attrs, attrs=self.attrs)) + html_indexes.append(match.group(1)) + else: + match = re.match(name + '_(\d+)_%ssubdict_0' % prefix, data_key) + if match is not None: + self.widgets.append( + self.subdict(sub_attrs=self.sub_attrs, + no_schema=0, + max_depth=self.max_depth, + flags=self.flags, + attrs=self.attrs) + ) + html_indexes.append(match.group(1)) + + return [widget.value_from_datadict( + data, files, + '%s_%s_%s' % (name, html_indexes[i], widget.suffix)) + for i, widget in enumerate(self.widgets)] + + def format_output(self, name, rendered_widgets): + class_depth = '' + if self.max_depth is not None: + class_depth = 'depth_%s' % self.max_depth + + params = {'id': "id_%s" % self.id_for_label(name), + 'class_depth': class_depth, + 'widgets': ''.join(rendered_widgets), + 'add_id': 'add_id_%s' % self.id_for_label(name), + 'add_sub_id': 'add_sub_id_%s' % self.id_for_label(name), + 'add_field': ADD_FIELD_VERBOSE, + 'add_dict': ADD_DICT_VERBOSE + } + + if 'FORCE_SCHEMA' not in self.flags: + actions = """ +%(add_field)s + + %(add_dict)s + +""" % params + else: + actions = '' + + params['actions'] = actions + + return """ +
    + %(widgets)s +
+%(actions)s +""" % params + + def update_widgets(self, keys, erase=False): + # import pdb + # pdb.set_trace() + if erase: + self.widgets = [] + for k in keys: + if (isinstance(k[1], dict)): + self.widgets.append( + self.subdict(key_value=k[0], schema=k[1], no_schema=2, + max_depth=self.max_depth, flags=self.flags, + sub_attrs=self.sub_attrs, attrs=self.attrs)) + else: + self.widgets.append(self.pair(sub_attrs=self.sub_attrs, + key_value=k[1], + attrs=self.attrs)) + + def _get_media(self): + """ + Mimic the MultiWidget '_get_media' method, adding other media + """ + if 'FORCE_SCHEMA' in self.flags: + media = Media() + else: + media = Media(js=MEDIAS) + + for w in self.widgets: + media = media + w.media + return media + media = property(_get_media) + + def dict_sort(self, d): + if isinstance(d, dict): + return OrderedDict([ + (k, self.dict_sort(v)) + for k, v in sorted(d.items()) + ]) + else: + return d + + +class Pair(MultiWidget): + """ + A widget representing a key-value pair in a dictionary + """ + + #default for a pair + key_type = TextInput + value_type = TextInput + suffix = 'pair' + + def __init__(self, sub_attrs, key_value=None, attrs=None, **kwargs): + widgets = [self.key_type()] if callable(self.key_type) else [] + if self.value_type in [TextInput, HiddenInput]: + if sub_attrs: + try: + widgets = [self.key_type(attrs=sub_attrs['key']), self.value_type(attrs=sub_attrs['value'])] + except KeyError: + raise KeyError("improper synthax for sub_attrs parameter") + else: + widgets = [self.key_type(), self.value_type()] + elif self.value_type == Dictionary: + if sub_attrs: + try: + widgets = [self.key_type(attrs=sub_attrs['key']), self.value_type(attrs=sub_attrs['value'], **kwargs)] + except KeyError: + raise KeyError("improper synthax for sub_attrs parameter") + else: + widgets = [self.key_type(), self.value_type(**kwargs)] + self.sub_attrs = sub_attrs + #raise error here ? + self.key_value = key_value if key_value is not None else '' + super(Pair, self).__init__(widgets, attrs) + + #this method should be overwritten by subclasses + def decompress(self, value): + if value is not None: + return list(value) + else: + return ['', ''] + + def render(self, name, value, attrs=None): + if self.is_localized: + for widget in self.widgets: + widget.is_localized = self.is_localized + if not isinstance(value, list): + value = self.decompress(value) + output = [] + final_attrs = self.build_attrs(attrs) + id_ = final_attrs.get('id') + for i, widget in enumerate(self.widgets): + try: + widget_value = value[i] + except IndexError: + widget_value = None + if id_: + final_attrs = dict(final_attrs, id='%s_%s' % (id_, i)) + output.append(widget.render(name + '_%s' % i, widget_value, final_attrs)) + return mark_safe(self.format_output(output, name)) + + def value_from_datadict(self, data, files, name): + return [widget.value_from_datadict(data, files, name + '_%s' % i) for i, widget in enumerate(self.widgets)] + + def format_output(self, rendered_widgets, name): + return '
  • ' + ' : '.join(rendered_widgets) + ' - Delete
  • \n' % name + + +class SubDictionary(Pair): + """ + A widget representing a key-value pair in a dictionary, where value is a dictionary + """ + key_type = TextInput + value_type = Dictionary + suffix = 'subdict' + + def __init__(self, sub_attrs, schema=None, **kwargs): + if schema is None: + schema = {'key': 'value'} + super(SubDictionary, self).__init__(schema=schema, + sub_attrs=sub_attrs, **kwargs) + + def decompress(self, value): + if value is not None: + return list(value) + else: + return ['', {}] + + def format_output(self, rendered_widgets, name): + params = { + "widgets": ' : '.join(rendered_widgets), + "del_id": "del_%s" % name + } + return """ +
  • %(widgets)s - Delete +
  • """ % params + + +class StaticPair(Pair): + """ + A widget representing a key-value pair in a dictionary, where key is just + text (this is only relevant when FORCE_SCHEMA flag is used) + """ + + key_type = HiddenInput + value_type = TextInput + suffix = 'stpair' + + # def __init__(self, key_value, attrs=None): + # super(StaticPair, self).__init__(key_value=key_value, attrs=attrs) + + def decompress(self, value): + value = super(StaticPair, self).decompress(value) + self.key_value = value[0] + return value + + def format_output(self, rendered_widgets, name): + params = { + "html_class": self.sub_attrs.get('key', {}).get('class', ''), + "key": self.key_value, + "widgets": ''.join(rendered_widgets) + } + return """ +
  • %(key)s : %(widgets)s +
  • """ % params + + +class StaticSubDictionary(SubDictionary): + """ + A widget representing a key-value pair in a dictionary, where key is just + text (this is only relevant when FORCE_SCHEMA flag is used) + """ + + key_type = HiddenInput + value_type = Dictionary + suffix = 'stsubdict' + + def decompress(self, value): + value = super(StaticSubDictionary, self).decompress(value) + self.key_value = value[0] + return value + + def format_output(self, rendered_widgets, name): + params = { + "html_class": self.sub_attrs.get('key', {}).get('class', ''), + "key": self.key_value, + "widgets": ''.join(rendered_widgets) + } + return """ +
  • %(key)s : %(widgets)s
  • +""" % params + +class EmbeddedFieldWidget(MultiWidget): + """ + A widget that render each field found in the supplied form. + """ + def __init__(self, fields, attrs=None): + self.fields = fields + super(EmbeddedFieldWidget, self).__init__([f.widget for f in self.fields.values()], attrs) + + def decompress(self, value): + """ + Retreieve each field value or provide the initial values + """ + if value: + return [value.__getitem__(field) for field in self.fields.keys()] + return [field.field.initial for field in self.fields.values()] + + def format_label(self, field, counter): + """ + Format the label for each field + """ + return '' % ( + counter, field.required and 'class="required"', field.label) + + def format_help_text(self, field, counter): + """ + Format the help text for the bound field + """ + if field.help_text != None: + return '(%s)' % field.help_text + return '' + + def format_output(self, rendered_widgets): + """ + This output will yeild all widgets grouped in a un-ordered list + """ + ret = ['
      '] + for i, field in enumerate(self.fields): + label = self.format_label(self.fields[field], i) + help_text = self.format_help_text(self.fields[field], i) + ret.append('
    • %s %s %s
    • ' % ( + label, help_text, rendered_widgets[i])) + + ret.append('
    ') + return u''.join(ret) diff --git a/django_mongoengine/mongo_admin/__init__.py b/django_mongoengine/mongo_admin/__init__.py new file mode 100644 index 0000000..2ea1316 --- /dev/null +++ b/django_mongoengine/mongo_admin/__init__.py @@ -0,0 +1,14 @@ +from django.utils.module_loading import autodiscover_modules + +from .options import DocumentAdmin +from .sites import site +from .decorators import register + +__all__ = ['DocumentAdmin', 'site', 'register'] + + +def autodiscover(): + autodiscover_modules('admin', register_to=site) + + +default_app_config = "django_mongoengine.mongo_admin.apps.MongoAdminConfig" diff --git a/django_mongoengine/mongo_admin/actions.py b/django_mongoengine/mongo_admin/actions.py new file mode 100644 index 0000000..aa240d1 --- /dev/null +++ b/django_mongoengine/mongo_admin/actions.py @@ -0,0 +1,105 @@ +""" +Built-in, globally-available admin actions. +""" + +from django import template +from django.core.exceptions import PermissionDenied +from django.contrib.admin import helpers +from django.contrib.admin.utils import get_deleted_objects, model_ngettext +from django.db import router +from django.shortcuts import render_to_response +from django.utils.translation import ugettext_lazy, ugettext as _ +from django.db import models + +from django.contrib.admin.actions import delete_selected as django_delete_selected + +from django_mongoengine.utils import force_text + + +def delete_selected(modeladmin, request, queryset): + if issubclass(modeladmin.model, models.Model): + return django_delete_selected(modeladmin, request, queryset) + else: + return _delete_selected(modeladmin, request, queryset) + +def _delete_selected(modeladmin, request, queryset): + """ + Default action which deletes the selected objects. + + This action first displays a confirmation page whichs shows all the + deleteable objects, or, if the user has no permission one of the related + childs (foreignkeys), a "permission denied" message. + + Next, it delets all selected objects and redirects back to the change list. + """ + opts = modeladmin.model._meta + app_label = opts.app_label + + # Check that the user has delete permission for the actual model + if not modeladmin.has_delete_permission(request): + raise PermissionDenied + + using = router.db_for_write(modeladmin.model) + + # Populate deletable_objects, a data structure of all related objects that + # will also be deleted. + # TODO: Permissions would be so cool... + deletable_objects, perms_needed, protected = get_deleted_objects( + queryset, opts, request.user, modeladmin.admin_site, using) + + # The user has already confirmed the deletion. + # Do the deletion and return a None to display the change list view again. + if request.POST.get('post'): + if perms_needed: + raise PermissionDenied + n = len(queryset) + if n: + for obj in queryset: + obj_display = force_text(obj) + modeladmin.log_deletion(request, obj, obj_display) + # call the objects delete method to ensure signals are + # processed. + obj.delete() + # This is what you get if you have to monkey patch every object in a changelist + # No queryset object, I can tell ya. So we get a new one and delete that. + #pk_list = [o.pk for o in queryset] + #klass = queryset[0].__class__ + #qs = klass.objects.filter(pk__in=pk_list) + #qs.delete() + modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % { + "count": n, "items": model_ngettext(modeladmin.opts, n) + }) + # Return None to display the change list page again. + return None + + if len(queryset) == 1: + objects_name = force_text(opts.verbose_name) + else: + objects_name = force_text(opts.verbose_name_plural) + + if perms_needed or protected: + title = _("Cannot delete %(name)s") % {"name": objects_name} + else: + title = _("Are you sure?") + + context = { + "title": title, + "objects_name": objects_name, + "deletable_objects": [deletable_objects], + 'queryset': queryset, + "perms_lacking": perms_needed, + "protected": protected, + "opts": opts, + "root_path": modeladmin.admin_site.root_path, + "app_label": app_label, + 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, + } + + # Display the confirmation page + return render_to_response(modeladmin.delete_selected_confirmation_template or [ + "admin/%s/%s/delete_selected_confirmation.html" % (app_label, opts.object_name.lower()), + "admin/%s/delete_selected_confirmation.html" % app_label, + "admin/delete_selected_confirmation.html" + ], context, context_instance=template.RequestContext(request)) + +delete_selected.short_description = ugettext_lazy("Delete selected %(verbose_name_plural)s") diff --git a/django_mongoengine/mongo_admin/apps.py b/django_mongoengine/mongo_admin/apps.py new file mode 100644 index 0000000..9c11b7f --- /dev/null +++ b/django_mongoengine/mongo_admin/apps.py @@ -0,0 +1,24 @@ +from django.apps import AppConfig +from django.core import checks +from django.utils.translation import ugettext_lazy as _ + +def check_admin_app(**kwargs): + from .sites import system_check_errors + return system_check_errors + + +class SimpleMongoAdminConfig(AppConfig): + """Simple AppConfig which does not do automatic discovery.""" + + name = "django_mongoengine.mongo_admin" + verbose_name = _("Administration") + + def ready(self): + checks.register(check_admin_app, checks.Tags.admin) + + +class MongoAdminConfig(SimpleMongoAdminConfig): + + def ready(self): + super(MongoAdminConfig, self).ready() + self.module.autodiscover() diff --git a/django_mongoengine/mongo_admin/decorators.py b/django_mongoengine/mongo_admin/decorators.py new file mode 100644 index 0000000..f30b2cd --- /dev/null +++ b/django_mongoengine/mongo_admin/decorators.py @@ -0,0 +1,28 @@ +def register(*models, **kwargs): + """ + Registers the given model(s) classes and wrapped ModelAdmin class with + admin site: + + @register(Author) + class AuthorAdmin(admin.ModelAdmin): + pass + + A kwarg of `site` can be passed as the admin site, otherwise the default + admin site will be used. + """ + from .options import DocumentAdmin + from .sites import site, AdminSite + + def _model_admin_wrapper(admin_class): + admin_site = kwargs.pop('site', site) + + if not isinstance(admin_site, AdminSite): + raise ValueError('site must subclass AdminSite') + + if not issubclass(admin_class, DocumentAdmin): + raise ValueError('Wrapped class must subclass ModelAdmin.') + + admin_site.register(models, admin_class=admin_class) + + return admin_class + return _model_admin_wrapper diff --git a/django_mongoengine/mongo_admin/helpers.py b/django_mongoengine/mongo_admin/helpers.py new file mode 100644 index 0000000..2ed7ec8 --- /dev/null +++ b/django_mongoengine/mongo_admin/helpers.py @@ -0,0 +1,147 @@ +from django.contrib.admin.utils import lookup_field +from django.contrib.admin.helpers import AdminForm as DjangoAdminForm +from django.contrib.admin.helpers import Fieldset as DjangoFieldSet +from django.contrib.admin.helpers import Fieldline as DjangoFieldLine +from django.contrib.admin.helpers import AdminReadonlyField as DjangoAdminReadonlyField +from django.contrib.admin.helpers import InlineAdminForm as DjangoInlineAdminForm +from django.contrib.admin.helpers import InlineAdminFormSet as DjangoInlineAdminFormSet +from django.contrib.admin.helpers import InlineFieldset as DjangoInlineFieldset +from django.contrib.admin.helpers import AdminField +from django.core.exceptions import ObjectDoesNotExist + +from django.utils.encoding import smart_text +from django.utils.html import conditional_escape +from django.utils.safestring import mark_safe + +from django_mongoengine.mongo_admin.util import (display_for_field, + label_for_field, help_text_for_field) + + +class AdminForm(DjangoAdminForm): + def __iter__(self): + for name, options in self.fieldsets: + yield Fieldset(self.form, name, + readonly_fields=self.readonly_fields, + model_admin=self.model_admin, + **options + ) + + +class Fieldset(DjangoFieldSet): + def __iter__(self): + for field in self.fields: + yield Fieldline(self.form, field, self.readonly_fields, model_admin=self.model_admin) + + +class Fieldline(DjangoFieldLine): + def __iter__(self): + for i, field in enumerate(self.fields): + if field in self.readonly_fields: + yield AdminReadonlyField(self.form, field, is_first=(i == 0), + model_admin=self.model_admin) + else: + yield AdminField(self.form, field, is_first=(i == 0)) + + +class AdminReadonlyField(DjangoAdminReadonlyField): + def __init__(self, form, field, is_first, model_admin=None): + label = label_for_field(field, form._meta.model, model_admin) + # Make self.field look a little bit like a field. This means that + # {{ field.name }} must be a useful class name to identify the field. + # For convenience, store other field-related data here too. + if callable(field): + class_name = field.__name__ != '' and field.__name__ or '' + else: + class_name = field + self.field = { + 'name': class_name, + 'label': label, + 'field': field, + 'help_text': help_text_for_field(class_name, form._meta.model) + } + self.form = form + self.model_admin = model_admin + self.is_first = is_first + self.is_checkbox = False + self.is_readonly = True + + def contents(self): + from django.contrib.admin.templatetags.admin_list import _boolean_icon + from django.contrib.admin.views.main import EMPTY_CHANGELIST_VALUE + field, obj, model_admin = self.field['field'], self.form.instance, self.model_admin + try: + f, attr, value = lookup_field(field, obj, model_admin) + except (AttributeError, ValueError, ObjectDoesNotExist): + result_repr = EMPTY_CHANGELIST_VALUE + else: + if f is None: + boolean = getattr(attr, "boolean", False) + if boolean: + result_repr = _boolean_icon(value) + else: + result_repr = smart_text(value) + if getattr(attr, "allow_tags", False): + result_repr = mark_safe(result_repr) + else: + if value is None: + result_repr = EMPTY_CHANGELIST_VALUE + #HERE WE NEED TO CHANGE THIS TEST + # elif isinstance(f.rel, ManyToManyRel): + # result_repr = ", ".join(map(unicode, value.all())) + else: + result_repr = display_for_field(value, f) + return conditional_escape(result_repr) + + +class InlineAdminFormSet(DjangoInlineAdminFormSet): + """ + A wrapper around an inline formset for use in the admin system. + """ + def __iter__(self): + for form, original in zip(self.formset.initial_forms, self.formset.get_queryset()): + yield InlineAdminForm(self.formset, form, self.fieldsets, + self.opts.prepopulated_fields, original, self.readonly_fields, + model_admin=self.opts) + for form in self.formset.extra_forms: + yield InlineAdminForm(self.formset, form, self.fieldsets, + self.opts.prepopulated_fields, None, self.readonly_fields, + model_admin=self.opts) + yield InlineAdminForm(self.formset, self.formset.empty_form, + self.fieldsets, self.opts.prepopulated_fields, None, + self.readonly_fields, model_admin=self.opts) + + +class InlineAdminForm(DjangoInlineAdminForm, AdminForm): + """ + A wrapper around an inline form for use in the admin system. + """ + def __init__(self, formset, form, fieldsets, prepopulated_fields, original, + readonly_fields=None, model_admin=None): + self.formset = formset + self.model_admin = model_admin + self.original = original + self.show_url = original and hasattr(original, 'get_absolute_url') + AdminForm.__init__(self, form, fieldsets, prepopulated_fields, + readonly_fields, model_admin) + + def pk_field(self): + # if there is no pk field then it's an embedded form so return none + if hasattr(self.formset, "_pk_field"): + return DjangoInlineAdminForm.pk_field(self) + else: + return None + + def __iter__(self): + for name, options in self.fieldsets: + yield InlineFieldset(self.formset, self.form, name, + self.readonly_fields, model_admin=self.model_admin, **options) + + +class InlineFieldset(DjangoInlineFieldset): + def __iter__(self): + fk = getattr(self.formset, "fk", None) + for field in self.fields: + if fk and fk.name == field: + continue + yield Fieldline(self.form, field, self.readonly_fields, + model_admin=self.model_admin) diff --git a/django_mongoengine/mongo_admin/management/__init__.py b/django_mongoengine/mongo_admin/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django_mongoengine/mongo_admin/management/commands/__init__.py b/django_mongoengine/mongo_admin/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django_mongoengine/mongo_admin/management/commands/createmongodbsuperuser.py b/django_mongoengine/mongo_admin/management/commands/createmongodbsuperuser.py new file mode 100644 index 0000000..a8788da --- /dev/null +++ b/django_mongoengine/mongo_admin/management/commands/createmongodbsuperuser.py @@ -0,0 +1,140 @@ +""" +Management utility to create superusers. +""" +import getpass +import re +import sys +from optparse import make_option + +from django_mongoengine.mongo_auth.models import MongoUser +from django_mongoengine.sessions import DEFAULT_CONNECTION_NAME +from django.core import exceptions +from django.core.management.base import BaseCommand, CommandError +from django.utils.translation import ugettext as _ + +get_default_username = lambda: "admin" + +RE_VALID_USERNAME = re.compile('[\w.@+-]+$') + +EMAIL_RE = re.compile( + r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*" # dot-atom + r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"' # quoted-string + r')@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}$', re.IGNORECASE) # domain + + +def is_valid_email(value): + if not EMAIL_RE.search(value): + raise exceptions.ValidationError(_('Enter a valid e-mail address.')) + + +class Command(BaseCommand): + help = 'Used to create a superuser.' + + def add_arguments(self, parser): + parser.add_argument( + '--username', dest='username', default=None, + help='Specifies the username for the superuser.' + ) + parser.add_argument( + '--email', dest='email', default=None, + help='Specifies the email address for the superuser.' + ) + parser.add_argument( + '--noinput', action='store_false', dest='interactive', default=True, + help=('Tells Django to NOT prompt the user for input of any kind. ' + 'You must use --username and --email with --noinput, and ' + 'superusers created with --noinput will not be able to log ' + 'in until they\'re given a valid password.') + ) + parser.add_argument( + '--database', action='store', dest='database', + default=DEFAULT_CONNECTION_NAME, help='Specifies the database to use. Default is "default".' + ) + + def handle(self, *args, **options): + username = options.get('username', None) + email = options.get('email', None) + interactive = options.get('interactive') + verbosity = int(options.get('verbosity', 1)) + database = options.get('database') + + # Do quick and dirty validation if --noinput + if not interactive: + if not username or not email: + raise CommandError("You must use --username and --email with --noinput.") + if not RE_VALID_USERNAME.match(username): + raise CommandError("Invalid username. Use only letters, digits, and underscores") + try: + is_valid_email(email) + except exceptions.ValidationError: + raise CommandError("Invalid email address.") + + # If not provided, create the user with an unusable password + password = None + + # Prompt for username/email/password. Enclose this whole thing in a + # try/except to trap for a keyboard interrupt and exit gracefully. + if interactive: + default_username = get_default_username() + try: + + # Get a username + while 1: + if not username: + input_msg = 'Username' + if default_username: + input_msg += ' (leave blank to use %r)' % default_username + if sys.version_info < (3,): + username = raw_input(input_msg + ': ') + else: + username = input(input_msg + ': ') + if default_username and username == '': + username = default_username + if not RE_VALID_USERNAME.match(username): + sys.stderr.write("Error: That username is invalid. Use only letters, digits and underscores.\n") + username = None + continue + try: + MongoUser.objects.get(username=username) + except MongoUser.DoesNotExist: + break + else: + sys.stderr.write("Error: That username is already taken.\n") + username = None + + # Get an email + while 1: + if not email: + if sys.version_info < (3,): + email = raw_input('E-mail address: ') + else: + email = input('E-mail address: ') + try: + is_valid_email(email) + except exceptions.ValidationError: + sys.stderr.write("Error: That e-mail address is invalid.\n") + email = None + else: + break + + # Get a password + while 1: + if not password: + password = getpass.getpass() + password2 = getpass.getpass('Password (again): ') + if password != password2: + sys.stderr.write("Error: Your passwords didn't match.\n") + password = None + continue + if password.strip() == '': + sys.stderr.write("Error: Blank passwords aren't allowed.\n") + password = None + continue + break + except KeyboardInterrupt: + sys.stderr.write("\nOperation cancelled.\n") + sys.exit(1) + + MongoUser.objects.create_superuser(username, email, password) + if verbosity >= 1: + self.stdout.write("Superuser created successfully.\n") diff --git a/django_mongoengine/mongo_admin/options.py b/django_mongoengine/mongo_admin/options.py new file mode 100644 index 0000000..ca293c7 --- /dev/null +++ b/django_mongoengine/mongo_admin/options.py @@ -0,0 +1,569 @@ +from django import forms +from django.forms.formsets import all_valid +from django.core.urlresolvers import reverse +from django.contrib.admin.exceptions import DisallowedModelAdminToField +from django.contrib.admin import widgets, helpers +from django.contrib.admin.utils import ( + unquote, flatten_fieldsets, get_deleted_objects, +) +from django.contrib.admin.options import ( + TO_FIELD_VAR, IS_POPUP_VAR, + get_ul_class, csrf_protect_m, +) +from django.utils import six +from django.utils.html import escape +from django.core.exceptions import PermissionDenied +try: + from django.db.models.related import RelatedObject +except ImportError: + from django.db.models.fields.related import ForeignObjectRel as RelatedObject # noqa +from django.http import Http404 +from django.template.response import TemplateResponse +from django.utils.functional import curry +from django.utils.text import capfirst +from django.utils.translation import ugettext as _ +from django.forms.forms import pretty_name +from django.conf import settings +from django.apps import apps + +from django_mongoengine.utils import force_text +from django_mongoengine.fields import (ListField, EmbeddedDocumentField, + ReferenceField, StringField) + +from django_mongoengine.mongo_admin.util import RelationWrapper + +from django_mongoengine.utils.wrappers import copy_class +from django_mongoengine.utils.monkey import get_patched_django_module +from django_mongoengine.forms.documents import ( + DocumentForm, + inlineformset_factory, BaseInlineDocumentFormSet) + + +def get_content_type_for_model(obj): + return apps.get_model("contenttypes.ContentType")() + + +djmod = get_patched_django_module( + "django.contrib.admin.options", + get_content_type_for_model=get_content_type_for_model, +) + +class BaseDocumentAdmin(djmod.BaseModelAdmin): + """Functionality common to both ModelAdmin and InlineAdmin.""" + form = DocumentForm + + def formfield_for_dbfield(self, db_field, **kwargs): + """ + Hook for specifying the form Field instance for a given database Field + instance. + + If kwargs are given, they're passed to the form Field's constructor. + """ + request = kwargs.pop("request", None) + + # If the field specifies choices, we don't need to look for special + # admin widgets - we just need to use a select widget of some kind. + if db_field.choices is not None: + return self.formfield_for_choice_field(db_field, request, **kwargs) + + if isinstance(db_field, ListField) and isinstance(db_field.field, ReferenceField): + return self.formfield_for_manytomany(db_field, request, **kwargs) + + # handle RelatedFields + if isinstance(db_field, ReferenceField): + # For non-raw_id fields, wrap the widget with a wrapper that adds + # extra HTML -- the "add other" interface -- to the end of the + # rendered output. formfield can be None if it came from a + # OneToOneField with parent_link=True or a M2M intermediary. + form_field = db_field.formfield(**kwargs) + if db_field.name not in self.raw_id_fields: + related_modeladmin = self.admin_site._registry.get(db_field.document_type) + can_add_related = bool(related_modeladmin and + related_modeladmin.has_add_permission(request)) + form_field.widget = widgets.RelatedFieldWidgetWrapper( + form_field.widget, RelationWrapper(db_field.document_type), self.admin_site, + can_add_related=can_add_related) + return form_field + + if isinstance(db_field, StringField): + if db_field.max_length is None: + kwargs = dict({'widget': widgets.AdminTextareaWidget}, **kwargs) + else: + kwargs = dict({'widget': widgets.AdminTextInputWidget}, **kwargs) + return db_field.formfield(**kwargs) + + # If we've got overrides for the formfield defined, use 'em. **kwargs + # passed to formfield_for_dbfield override the defaults. + for klass in db_field.__class__.mro(): + if klass in self.formfield_overrides: + kwargs = dict(self.formfield_overrides[klass], **kwargs) + return db_field.formfield(**kwargs) + + # For any other type of field, just call its formfield() method. + return db_field.formfield(**kwargs) + + def formfield_for_choice_field(self, db_field, request=None, **kwargs): + """ + Get a form Field for a database Field that has declared choices. + """ + # If the field is named as a radio_field, use a RadioSelect + if db_field.name in self.radio_fields: + # Avoid stomping on custom widget/choices arguments. + if 'widget' not in kwargs: + kwargs['widget'] = widgets.AdminRadioSelect(attrs={ + 'class': get_ul_class(self.radio_fields[db_field.name]), + }) + if 'choices' not in kwargs: + kwargs['choices'] = db_field.get_choices( + include_blank = db_field.blank, + blank_choice=[('', _('None'))] + ) + return db_field.formfield(**kwargs) + + + def formfield_for_manytomany(self, db_field, request=None, **kwargs): + """ + Get a form Field for a ManyToManyField. + """ + db = kwargs.get('using') + + if db_field.name in self.raw_id_fields: + kwargs['widget'] = widgets.ManyToManyRawIdWidget(db_field.rel, using=db) + kwargs['help_text'] = '' + elif db_field.name in (list(self.filter_vertical) + list(self.filter_horizontal)): + kwargs['widget'] = widgets.FilteredSelectMultiple(pretty_name(db_field.name), (db_field.name in self.filter_vertical)) + + return db_field.formfield(**kwargs) + + def get_view_on_site_url(self, obj=None): + if obj is None or not self.view_on_site: + return None + + if callable(self.view_on_site): + return self.view_on_site(obj) + elif self.view_on_site and hasattr(obj, 'get_absolute_url'): + # use the ContentType lookup if view_on_site is True + return reverse('admin:view_on_site', kwargs={ + 'content_type_id': 0, + 'object_id': obj.pk + }) + + +@copy_class(djmod.ModelAdmin) +class DocumentAdmin(BaseDocumentAdmin): + "Encapsulates all admin options and functionality for a given model." + + + def __init__(self, model, admin_site): + self.model = model + self.opts = model._meta + self.admin_site = admin_site + super(DocumentAdmin, self).__init__() + self.log = not settings.DATABASES.get('default', {}).get( + 'ENGINE', 'django.db.backends.dummy' + ).endswith('dummy') + +# XXX: add inline init somewhere + def _get_inline_instances(self): + for f in six.itervalues(self.model._fields): + if not (isinstance(f, ListField) and isinstance(getattr(f, 'field', None), EmbeddedDocumentField)) and not isinstance(f, EmbeddedDocumentField): + continue + # Should only reach here if there is an embedded document... + if f.name in self.exclude: + continue + document = self.model() + if hasattr(f, 'field') and f.field is not None: + embedded_document = f.field.document_type + elif hasattr(f, 'document_type'): + embedded_document = f.document_type + else: + # For some reason we found an embedded field were either + # the field attribute or the field's document type is None. + # This shouldn't happen, but apparently does happen: + # https://github.com/jschrewe/django-mongoadmin/issues/4 + # The solution for now is to ignore that field entirely. + continue + inline_admin = EmbeddedStackedDocumentAdmin + # check if there is an admin for the embedded document in + # self.inlines. If there is, use this, else use default. + for inline_class in self.inlines: + if inline_class.document == embedded_document: + inline_admin = inline_class + inline_instance = inline_admin(f, document, self.admin_site) + # if f is an EmbeddedDocumentField set the maximum allowed form instances to one + if isinstance(f, EmbeddedDocumentField): + inline_instance.max_num = 1 + # exclude field from normal form + if f.name not in self.exclude: + self.exclude.append(f.name) + if f.name == 'created_at' and f.name not in self.exclude: + self.exclude.append(f.name) + self.inline_instances.append(inline_instance) + + def get_changelist_form(self, request, **kwargs): + kwargs.setdefault("form", DocumentForm) + return super(DocumentAdmin, self).get_changelist_form(request, **kwargs) + + + def get_changelist_formset(self, request, **kwargs): + kwargs.setdefault("form", DocumentForm) + return super(DocumentAdmin, self).get_changelist_formset(request, **kwargs) + + + def log_addition(self, request, object, message): + """ + Log that an object has been successfully added. + + The default implementation creates an admin LogEntry object. + """ + if not self.log: + return + super(DocumentAdmin, self).log_addition(request, object, message) + + + def log_change(self, request, object, message): + """ + Log that an object has been successfully changed. + + The default implementation creates an admin LogEntry object. + """ + if not self.log: + return + super(DocumentAdmin, self).log_change(request, object, message) + + def log_deletion(self, request, object, object_repr): + """ + Log that an object will be deleted. Note that this method is called + before the deletion. + + The default implementation creates an admin LogEntry object. + """ + if not self.log: + return + super(DocumentAdmin, self).log_deletion(request, object, object_repr) + + @csrf_protect_m + def changeform_view(self, request, object_id=None, form_url='', extra_context=None): + + to_field = request.POST.get(TO_FIELD_VAR, request.GET.get(TO_FIELD_VAR)) + if to_field and not self.to_field_allowed(request, to_field): + raise DisallowedModelAdminToField("The field %s cannot be referenced." % to_field) + + model = self.model + opts = model._meta + + if request.method == 'POST' and '_saveasnew' in request.POST: + object_id = None + + add = object_id is None + + if add: + if not self.has_add_permission(request): + raise PermissionDenied + obj = None + + else: + obj = self.get_object(request, unquote(object_id), to_field) + + if not self.has_change_permission(request, obj): + raise PermissionDenied + + if obj is None: + raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % { + 'name': force_text(opts.verbose_name), 'key': escape(object_id)}) + + ModelForm = self.get_form(request, obj) + if request.method == 'POST': + form = ModelForm(request.POST, request.FILES, instance=obj) + if form.is_valid(): + form_validated = True + new_object = self.save_form(request, form, change=not add) + else: + form_validated = False + new_object = form.instance + formsets, inline_instances = self._create_formsets(request, new_object, change=not add) + if all_valid(formsets) and form_validated: + self.save_model(request, new_object, form, not add) + self.save_related(request, form, formsets, not add) + change_message = self.construct_change_message(request, form, formsets, add) + if add: + self.log_addition(request, new_object, change_message) + return self.response_add(request, new_object) + else: + self.log_change(request, new_object, change_message) + return self.response_change(request, new_object) + else: + form_validated = False + else: + if add: + initial = self.get_changeform_initial_data(request) + form = ModelForm(initial=initial) + formsets, inline_instances = self._create_formsets(request, form.instance, change=False) + else: + form = ModelForm(instance=obj) + formsets, inline_instances = self._create_formsets(request, obj, change=True) + + adminForm = helpers.AdminForm( + form, + list(self.get_fieldsets(request, obj)), + self.get_prepopulated_fields(request, obj), + self.get_readonly_fields(request, obj), + model_admin=self) + media = self.media + adminForm.media + + inline_formsets = self.get_inline_formsets(request, formsets, inline_instances, obj) + for inline_formset in inline_formsets: + media = media + inline_formset.media + + context = dict(self.admin_site.each_context(request), + title=(_('Add %s') if add else _('Change %s')) % force_text(opts.verbose_name), + adminform=adminForm, + object_id=object_id, + original=obj, + is_popup=(IS_POPUP_VAR in request.POST or + IS_POPUP_VAR in request.GET), + to_field=to_field, + media=media, + inline_admin_formsets=inline_formsets, + errors=helpers.AdminErrorList(form, formsets), + preserved_filters=self.get_preserved_filters(request), + ) + + # Hide the "Save" and "Save and continue" buttons if "Save as New" was + # previously chosen to prevent the interface from getting confusing. + if request.method == 'POST' and not form_validated and "_saveasnew" in request.POST: + context['show_save'] = False + context['show_save_and_continue'] = False + # Use the change template instead of the add template. + add = False + + context.update(extra_context or {}) + + return self.render_change_form(request, context, add=add, change=not add, obj=obj, form_url=form_url) + + + @csrf_protect_m + def delete_view(self, request, object_id, extra_context=None): + "The 'delete' admin view for this model." + opts = self.model._meta + app_label = opts.app_label + + to_field = request.POST.get(TO_FIELD_VAR, request.GET.get(TO_FIELD_VAR)) + if to_field and not self.to_field_allowed(request, to_field): + raise DisallowedModelAdminToField("The field %s cannot be referenced." % to_field) + + obj = self.get_object(request, unquote(object_id), to_field) + + if not self.has_delete_permission(request, obj): + raise PermissionDenied + + if obj is None: + raise Http404( + _('%(name)s object with primary key %(key)r does not exist.') % + {'name': force_text(opts.verbose_name), 'key': escape(object_id)} + ) + + from django.db import router + using = router.db_for_write(self.model) + + # Populate deleted_objects, a data structure of all related objects that + # will also be deleted. + (deleted_objects, model_count, perms_needed, protected) = get_deleted_objects( + [obj], opts, request.user, self.admin_site, using) + + if request.POST: # The user has already confirmed the deletion. + if perms_needed: + raise PermissionDenied + obj_display = force_text(obj) + attr = str(to_field) if to_field else opts.pk.attname + obj_id = obj.serializable_value(attr) + self.log_deletion(request, obj, obj_display) + self.delete_model(request, obj) + + return self.response_delete(request, obj_display, obj_id) + + object_name = force_text(opts.verbose_name) + + if perms_needed or protected: + title = _("Cannot delete %(name)s") % {"name": object_name} + else: + title = _("Are you sure?") + + context = dict( + self.admin_site.each_context(request), + title=title, + object_name=object_name, + object=obj, + deleted_objects=deleted_objects, + model_count=dict(model_count).items(), + perms_lacking=perms_needed, + protected=protected, + opts=opts, + app_label=app_label, + preserved_filters=self.get_preserved_filters(request), + is_popup=(IS_POPUP_VAR in request.POST or + IS_POPUP_VAR in request.GET), + to_field=to_field, + ) + context.update(extra_context or {}) + + return self.render_delete_form(request, context) + + def history_view(self, request, object_id, extra_context=None): + "The 'history' admin view for this model." + from django.contrib.admin.models import LogEntry + # First check if the user can see this history. + model = self.model + obj = self.get_object(request, unquote(object_id)) + if obj is None: + raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % { + 'name': force_text(model._meta.verbose_name), + 'key': escape(object_id), + }) + + if not self.has_change_permission(request, obj): + raise PermissionDenied + + # Then get the history for this object. + opts = model._meta + app_label = opts.app_label + action_list = LogEntry.objects.filter( + object_id=unquote(object_id), + content_type=get_content_type_for_model(model) + ).select_related().order_by('action_time') + + context = dict(self.admin_site.each_context(request), + title=_('Change history: %s') % force_text(obj), + action_list=action_list, + module_name=capfirst(force_text(opts.verbose_name_plural)), + object=obj, + opts=opts, + preserved_filters=self.get_preserved_filters(request), + ) + context.update(extra_context or {}) + + request.current_app = self.admin_site.name + + return TemplateResponse(request, self.object_history_template or [ + "admin/%s/%s/object_history.html" % (app_label, opts.model_name), + "admin/%s/object_history.html" % app_label, + "admin/object_history.html" + ], context) + + +class InlineDocumentAdmin(BaseDocumentAdmin): + """ + Options for inline editing of ``model`` instances. + + Provide ``name`` to specify the attribute name of the ``ForeignKey`` from + ``model`` to its parent. This is required if ``model`` has more than one + ``ForeignKey`` to its parent. + """ + document = None + fk_name = None + formset = BaseInlineDocumentFormSet + extra = 1 + max_num = None + template = None + verbose_name = None + verbose_name_plural = None + can_delete = True + + def __init__(self, parent_document, admin_site): + self.admin_site = admin_site + self.parent_document = parent_document + self.opts = self.model._meta + + super(InlineDocumentAdmin, self).__init__() + + if self.verbose_name is None: + self.verbose_name = self.model._meta.verbose_name + + if self.verbose_name_plural is None: + self.verbose_name_plural = self.model._meta.verbose_name_plural + + def _media(self): + from django.conf import settings + js = ['js/jquery.min.js', 'js/jquery.init.js', 'js/inlines.min.js'] + if self.prepopulated_fields: + js.append('js/urlify.js') + js.append('js/prepopulate.min.js') + if self.filter_vertical or self.filter_horizontal: + js.extend(['js/SelectBox.js' , 'js/SelectFilter2.js']) + return forms.Media(js=['%s%s' % (settings.ADMIN_MEDIA_PREFIX, url) for url in js]) + media = property(_media) + + def get_formset(self, request, obj=None, **kwargs): + """Returns a BaseInlineFormSet class for use in admin add/change views.""" + if self.declared_fieldsets: + fields = flatten_fieldsets(self.declared_fieldsets) + else: + fields = None + if self.exclude is None: + exclude = [] + else: + exclude = list(self.exclude) + exclude.extend(kwargs.get("exclude", [])) + exclude.extend(self.get_readonly_fields(request, obj)) + # if exclude is an empty list we use None, since that's the actual + # default + exclude = exclude or None + defaults = { + "form": self.form, + "formset": self.formset, + "fields": fields, + "exclude": exclude, + "formfield_callback": curry(self.formfield_for_dbfield, request=request), + "extra": self.extra, + "max_num": self.max_num, + "can_delete": self.can_delete, + } + defaults.update(kwargs) + return inlineformset_factory(self.model, **defaults) + + def get_fieldsets(self, request, obj=None): + if self.declared_fieldsets: + return self.declared_fieldsets + form = self.get_formset(request).form + fields = form.base_fields.keys() + list(self.get_readonly_fields(request, obj)) + return [(None, {'fields': fields})] + +class EmbeddedDocumentAdmin(InlineDocumentAdmin): + def __init__(self, field, parent_document, admin_site): + if hasattr(field, 'field'): + self.model = field.field.document_type + else: + self.model = field.document_type + self.doc_list = getattr(parent_document, field.name) + self.field = field + if not isinstance(self.doc_list, list): + self.doc_list = [] + self.rel_name = field.name + + if self.verbose_name is None: + self.verbose_name = "Field: %s (Document: %s)" % (capfirst(field.name), self.model._meta.verbose_name) + + if self.verbose_name_plural is None: + self.verbose_name_plural = "Field: %s (Document: %s)" % (capfirst(field.name), self.model._meta.verbose_name_plural) + + super(EmbeddedDocumentAdmin, self).__init__(parent_document, admin_site) + + def queryset(self, request): + if isinstance(self.field, ListField): # list field + self.doc_list = getattr(self.parent_document, self.rel_name) + else: # embedded field + emb_doc = getattr(self.parent_document, self.rel_name) + if emb_doc is None: + self.doc_list = [] + else: + self.doc_list = [emb_doc] + return self.doc_list + +class StackedDocumentInline(InlineDocumentAdmin): + template = 'admin/edit_inline/stacked.html' + +class EmbeddedStackedDocumentAdmin(EmbeddedDocumentAdmin): + template = 'admin/edit_inline/stacked.html' + +class TabularDocumentInline(InlineDocumentAdmin): + template = 'admin/edit_inline/tabular.html' diff --git a/django_mongoengine/mongo_admin/sites.py b/django_mongoengine/mongo_admin/sites.py new file mode 100644 index 0000000..be17f08 --- /dev/null +++ b/django_mongoengine/mongo_admin/sites.py @@ -0,0 +1,33 @@ +from django.contrib.admin import sites + +from mongoengine.base import TopLevelDocumentMetaclass + +from django_mongoengine.mongo_admin.options import DocumentAdmin +from django_mongoengine.forms.document_options import DocumentMetaWrapper +#from django_mongoengine.mongo_admin import actions + +system_check_errors = [] + +class AdminSite(sites.AdminSite): + index_template = "mongo_admin/index.html" + + def register(self, model_or_iterable, admin_class=None, **options): + + if isinstance(model_or_iterable, TopLevelDocumentMetaclass) and not admin_class: + admin_class = DocumentAdmin + + if isinstance(model_or_iterable, TopLevelDocumentMetaclass): + model_or_iterable._meta = DocumentMetaWrapper(model_or_iterable) + model_or_iterable = [model_or_iterable] + + super(AdminSite, self).register(model_or_iterable, admin_class, **options) + + def unregister(self, model_or_iterable): + if isinstance(model_or_iterable, TopLevelDocumentMetaclass): + model_or_iterable = [model_or_iterable] + + super(AdminSite, self).unregister(model_or_iterable) + +# This global object represents the default admin site, for the common case. +# You can instantiate AdminSite in your own code to create a custom admin site. +site = AdminSite() diff --git a/django_mongoengine/mongo_admin/static/dict.js b/django_mongoengine/mongo_admin/static/dict.js new file mode 100644 index 0000000..9f81256 --- /dev/null +++ b/django_mongoengine/mongo_admin/static/dict.js @@ -0,0 +1,329 @@ +$(document).ready(function(){ + + /*----------------------------------------------------------------------*/ + var DEBUG = true; + + function print_array(a,name){ + debug('--------------------'); + if ($.isArray(a)){ + for (var key in a){ + if (key === 'length' || !a.hasOwnProperty(key)) continue; + debug(name+'['+key+'] = '+a[key]); + } + } + } + /*----------------------------------------------------------------------*/ + + /************************************************************************ + Those array are useful to keep track of the different ids + ************************************************************************/ + + var prefixes = []; + var next_pair_ids = []; + var next_dict_ids = []; + var dictionary_ul = $('.dictionary'); + var depths = []; + var id; + + /************************************************************************ + Initialization + ************************************************************************/ + + dictionary_ul.each(function(index){ + debug('-----------INIT-----------'); + var el = $(this); + save_arrays(el); + debug('---------END INIT---------'); + }); + + $('.del_pair').each(function(){ + hide_delete(this); + }); + + $('.del_dict').each(function(){ + hide_delete(this); + }); + + print_array(prefixes,'prefixes'); + print_array(next_pair_ids,'pairs ids'); + print_array(next_dict_ids,'dict ids'); + print_array(depths,'depths'); + + /************************************************************************ + Save array information + ************************************************************************/ + + function save_arrays(el){ + var id = el.attr('id'); + debug(id); + prefixes[id] = id.substring(0,id.length-1); + var next_ids = get_next_ids(el.children('li:last-child').children('input:first-child').attr('id'),prefixes[id]); + next_pair_ids[id] = next_ids[0]; + next_dict_ids[id] = next_ids[1]; + var cl = el.attr('class'); + var i; + if ((i = cl.indexOf('depth_')) != -1){ + depths[id] = cl.substring(i+6); + if (depths[id] == '0'){ + debug('depth equal to zero'); + $('.add_sub_dictionary').remove(); + } + } + else{ + depths[id] = -1; + } + } + + /************************************************************************ + Hiding the Delete buttons where dictionaries + only have one child + ************************************************************************/ + + function hide_delete(el){ + var id = 'id' + $(el).attr('id').substring(3) + '_0'; + var parent = $("ul:has(>li >#"+id+")"); + + if (parent.children("li").size() == 1){ + debug('---------NO DEL---------'); + $(el).hide(); + } + } + + /************************************************************************ + Get the next HTML element representing a simple pair + ************************************************************************/ + + function get_pair(id){ + debug('--------GET PAIR-------->'); + debug('id : '+id); + return '
  • : '+ + ''+ + ' - Delete
  • '; + } + + /************************************************************************ + Get the next HTML element representing a sub-dictionary + ************************************************************************/ + + function get_dict(id, parent){ + debug('--------GET DICT-------->'); + debug('id : '+id); + debug('depth : '+ depths[parent]); + this_depth = id.match(/subdict/igm); + this_depth = (this_depth) ? this_depth.length : 0; + class_depth = (depths[parent] != -1) ? 'depth_' + depths[parent] : ''; + + subdict = '
  • : '; + subdict += '
      '; + subdict += '
    • : '; + subdict += ''; + subdict += ' - Delete
    '; + subdict += 'Add field'; + if (this_depth < depths[parent]){ + subdict += ' - Add subdictionary'; + } + subdict += ' - Delete
  • '; + return subdict; + } + + /************************************************************************ + Update array information and append HTML + when pair is added + ************************************************************************/ + + function pair_update_arrays(id){ + var el, i, del_pair_button; + debug('--------PAIR UPDATE--------'); + print_array(prefixes,'prefixes'); + print_array(next_pair_ids,'pairs ids'); + print_array(next_dict_ids,'dict ids'); + el = $('#'+id); + el.append(get_pair(next_pair_ids[id])); + del_pair_button = $('#del_'+ next_pair_ids[id].substring(3,next_pair_ids[id].length-1)); + el.children('li').children('.del_pair').show(); + el.children('li').children('.del_dict').show(); + i = parseInt(next_pair_ids[id].substring(prefixes[id].length,next_pair_ids[id].length-5),10) + 1; + debug('i = '+i); + next_pair_ids[id] = prefixes[id] + i + '_pair_'; + next_dict_ids[id] = prefixes[id] + i + '_subdict_'; + print_array(prefixes,'prefixes'); + print_array(next_pair_ids,'pairs ids'); + print_array(next_dict_ids,'dict ids'); + + //Event Binding + del_pair_button.click(function(){ + debug('---------DEL INNER---------'); + var id = 'id' + $(this).attr('id').substring(3) + '_0'; + delete_row(id,'pair'); + }); + } + + /************************************************************************ + Update array information and append HTML + when subdictionary is added + ************************************************************************/ + + function dict_update_arrays(id){ + var el, i, del_pair_button, del_dict_button, new_id; + debug('--------DICT UPDATE--------'); + el = $('#'+id); + el.append(get_dict(next_dict_ids[id], id)); + del_pair_button = $('#del_'+ next_dict_ids[id].substring(3) +'1_0_pair'); + del_dict_button = $('#del_'+ next_dict_ids[id].substring(3, next_dict_ids[id].length-1)); + el.children('li').children('.del_pair').show(); + el.children('li').children('.del_dict').show(); + debug(del_pair_button); + debug(del_dict_button); + i = parseInt(next_dict_ids[id].substring(prefixes[id].length,next_dict_ids[id].length-8), 10) + 1; + debug('i = '+i); + + new_id = next_dict_ids[id] + '1_0'; + + prefixes[new_id] = next_dict_ids[id] + '1_'; + next_pair_ids[new_id] = prefixes[new_id] + '1_pair_'; + next_dict_ids[new_id] = prefixes[new_id] + '1_subdict_'; + depths[new_id] = depths[id]; + + print_array(prefixes,'prefixes'); + print_array(next_pair_ids,'pairs ids'); + print_array(next_dict_ids,'dict ids'); + + //Event Binding + $('#add_pair_'+ new_id).click(function(){ + debug('--------CLICK INNER--------'); + pair_update_arrays(new_id); + debug('---------END CLICK---------'); + }); + $('#add_sub_'+ new_id).click(function(){ + debug('--------CLICK INNER--------'); + dict_update_arrays(new_id); + debug('---------END CLICK---------'); + }); + + $(del_pair_button).click(function(){ + var id = 'id' + $(this).attr('id').substring(3) + '_0'; + delete_row(id,'pair'); + }); + + $(del_dict_button).click(function(){ + var id = 'id' + $(this).attr('id').substring(3) + '_0'; + delete_row(id,'dict'); + }); + + //hide the del_pair button as there is only one row + $(del_pair_button).hide(); + + next_pair_ids[id] = prefixes[id] + i + '_pair_'; + next_dict_ids[id] = prefixes[id] + i + '_subdict_'; + } + + /************************************************************************ + Get the next ids for the future pair/sub-dictionary, + for a dictionary referenced by id + ************************************************************************/ + + function get_next_ids(id, prefix){ + debug('-----------GET NEXT IDS-----------'); + debug('id : '+ id); + debug('prefix : '+ prefix); + var n_type = id.substring(prefix.length); + var first; + + if ((i = n_type.search('pair')) > 0){ + first = prefix + (parseInt(n_type.substring(0,i), 10)+1); + debug('---------END GET NEXT IDS---------'); + return Array(first+'_pair_',first+'_subdict_'); + } + else if ((i = n_type.search('subdict')) > 0){ + first = prefix + (parseInt(n_type.substring(0,i), 10)+1); + debug('---------END GET NEXT IDS---------'); + return Array(first+'_pair_',first+'_subdict_'); + } + debug('--------ERROR GET NEXT IDS--------'); + return ''; + } + + /************************************************************************ + Add a field to a dictionary or sub-dictionary + ************************************************************************/ + + $('.add_pair_dictionary').click(function(){ + debug('-----------CLICK-----------'); + id = $(this).attr('id').substring(4); + debug('id : '+id); + pair_update_arrays(id); + debug('---------END CLICK---------'); + }); + + /************************************************************************ + Add a dictionary to a dictionary or sub-dictionary + ************************************************************************/ + + $('.add_sub_dictionary').click(function(){ + debug('-----------CLICK-----------'); + id = $(this).attr('id').substring(8); + debug('id : '+id); + dict_update_arrays(id); + debug('---------END CLICK---------'); + }); + + /************************************************************************ + Delete a row, according to its type + ************************************************************************/ + + function delete_row(id){ + debug('---------DEL CLICK---------'); + var parent = $("ul:has(>li >#"+id+")"); + var parent_id = parent.attr('id'); + + debug('id :' + id); + debug('parent id :' + parent_id); + if (parent.children("li").size() > 1){ + $("li:has(>#"+ id +")").remove(); + + var next_ids = get_next_ids(parent.children('li:last-child').children('input:first-child').attr('id'),prefixes[parent_id]); + next_pair_ids[parent_id] = next_ids[0]; + next_dict_ids[parent_id] = next_ids[1]; + } + + if (parent.children("li").size() == 1){ + debug('---------NO DEL---------'); + parent.children('li').children('.del_pair').hide(); + parent.children('li').children('.del_dict').hide(); + } + } + + /************************************************************************ + Delete a pair + ************************************************************************/ + + $('.del_pair').click(function(){ + debug('---------DEL CLICK---------'); + id = 'id' + $(this).attr('id').substring(3) + '_0'; + delete_row(id); + + print_array(prefixes,'prefixes'); + print_array(next_pair_ids,'pairs ids'); + print_array(next_dict_ids,'dict ids'); + }); + + /************************************************************************ + Delete a sub-dictionary + ************************************************************************/ + + $('.del_dict').click(function(){ + debug('-------DEL CLICK DICT-------'); + id = 'id' + $(this).attr('id').substring(3) + '_0'; + delete_row(id); + + print_array(prefixes,'prefixes'); + print_array(next_pair_ids,'pairs ids'); + print_array(next_dict_ids,'dict ids'); + }); + + function debug(text) { + if (DEBUG) { + console.log(text); + } + } +}); diff --git a/django_mongoengine/mongo_admin/static/helper.js b/django_mongoengine/mongo_admin/static/helper.js new file mode 100644 index 0000000..660b785 --- /dev/null +++ b/django_mongoengine/mongo_admin/static/helper.js @@ -0,0 +1,64 @@ +$(document).ready(function(){ + + /*----------------------------------------------------------------------*/ + var DEBUG = false; + + function print_array(a,name){ + debug('--------------------'); + if ($.isArray(a)){ + for (var key in a){ + if (key === 'length' || !a.hasOwnProperty(key)) continue; + debug(name+'['+key+'] = '+a[key]); + } + } + } + /*----------------------------------------------------------------------*/ + + /************************************************************************ + Transform full read-only dictionaries in text + ************************************************************************/ + + var readonly_dicts = $('p:contains({)'); + debug(readonly_dicts); + readonly_dicts.each(function(){ + var text = $(this).text(); + text = text.replace(/u'/g, ''); + text = text.replace(/'/g, ''); + $(this).html(get_html(text)); + }); + + function get_html(text){ + debug('------ENTERING get_html'); + var html = '
      '; + var pairs = get_pairs(text); + debug(pairs); + for (var i = 0; i < pairs.length; i++){ + if (pairs[i][1].contains('{')){ + html += '
    • ' + pairs[i][0] + ': ' + get_html(pairs[i][1]) + '
    • '; + } + else { + html += '
    • ' + pairs[i][0] + ': ' + pairs[i][1] + '
    • '; + } + } + return html + '
    '; + } + + function get_pairs(text){ + text = text.slice(1,-1); + //checker si indexOf({) existe et est plus petit que indexOf(,), + //si oui, on ne fait rien sur le premier et on passe au 2e ? comment ? + var pairs = text.split(', ', 1); + for (var i = 0; i < pairs.length; i++){ + pairs[i] = pairs[i].split(': '); + } + debug('------PAIRS : '); + debug(pairs); + return pairs; + } + + function debug(text) { + if (DEBUG) { + console.log(text) + } + } +}); \ No newline at end of file diff --git a/django_mongoengine/mongo_admin/static/jquery-1.8.0.min.js b/django_mongoengine/mongo_admin/static/jquery-1.8.0.min.js new file mode 100644 index 0000000..066d72c --- /dev/null +++ b/django_mongoengine/mongo_admin/static/jquery-1.8.0.min.js @@ -0,0 +1,2 @@ +/*! jQuery v@1.8.0 jquery.com | jquery.org/license */ +(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write(""),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bR[a]=c,c}function ch(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||cd.test(a)?d(a,e):ch(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ch(a+"["+e+"]",b[e],c,d);else d(a,b)}function cy(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.0",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return typeof a=="object"?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b
    a",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length||!d)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="
    t
    ",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="
    ",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/^(?:\{.*\}|\[.*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||++p.uuid:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.shift(),e=p._queueHooks(a,b),f=function(){p.dequeue(a,b)};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),delete e.stop,d.call(a,f,e)),!c.length&&e&&e.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c-1)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c-1)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,""+d),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;jq&&u.push({elem:this,matches:o.slice(q)});for(d=0;d0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bd(a,b,c,d){var e=0,f=b.length;for(;e0?h(g,c,f):[]}function bf(a,c,d,e,f){var g,h,i,j,k,l,m,n,p=0,q=f.length,s=L.POS,t=new RegExp("^"+s.source+"(?!"+r+")","i"),u=function(){var a=1,c=arguments.length-2;for(;ai){m=a.slice(i,g.index),i=n,l=[c],B.test(m)&&(k&&(l=k),k=e);if(h=H.test(m))m=m.slice(0,-5).replace(B,"$&*");g.length>1&&g[0].replace(t,u),k=be(m,g[1],g[2],l,k,h)}}k?(j=j.concat(k),(m=a.slice(i))&&m!==")"?B.test(m)?bd(m,j,d,e):Z(m,c,d,e?e.concat(k):k):o.apply(d,j)):Z(a,c,d,e)}return q===1?d:Z.uniqueSort(d)}function bg(a,b,c){var d,e,f,g=[],i=0,j=D.exec(a),k=!j.pop()&&!j.pop(),l=k&&a.match(C)||[""],m=$.preFilter,n=$.filter,o=!c&&b!==h;for(;(e=l[i])!=null&&k;i++){g.push(d=[]),o&&(e=" "+e);while(e){k=!1;if(j=B.exec(e))e=e.slice(j[0].length),k=d.push({part:j.pop().replace(A," "),captures:j});for(f in n)(j=L[f].exec(e))&&(!m[f]||(j=m[f](j,b,c)))&&(e=e.slice(j.shift().length),k=d.push({part:f,captures:j}));if(!k)break}}return k||Z.error(a),g}function bh(a,b,e){var f=b.dir,g=m++;return a||(a=function(a){return a===e}),b.first?function(b,c){while(b=b[f])if(b.nodeType===1)return a(b,c)&&b}:function(b,e){var h,i=g+"."+d,j=i+"."+c;while(b=b[f])if(b.nodeType===1){if((h=b[q])===j)return b.sizset;if(typeof h=="string"&&h.indexOf(i)===0){if(b.sizset)return b}else{b[q]=j;if(a(b,e))return b.sizset=!0,b;b.sizset=!1}}}}function bi(a,b){return a?function(c,d){var e=b(c,d);return e&&a(e===!0?c:e,d)}:b}function bj(a,b,c){var d,e,f=0;for(;d=a[f];f++)$.relative[d.part]?e=bh(e,$.relative[d.part],b):(d.captures.push(b,c),e=bi(e,$.filter[d.part].apply(null,d.captures)));return e}function bk(a){return function(b,c){var d,e=0;for(;d=a[e];e++)if(d(b,c))return!0;return!1}}var c,d,e,f,g,h=a.document,i=h.documentElement,j="undefined",k=!1,l=!0,m=0,n=[].slice,o=[].push,q=("sizcache"+Math.random()).replace(".",""),r="[\\x20\\t\\r\\n\\f]",s="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",t=s.replace("w","w#"),u="([*^$|!~]?=)",v="\\["+r+"*("+s+")"+r+"*(?:"+u+r+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+t+")|)|)"+r+"*\\]",w=":("+s+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|((?:[^,]|\\\\,|(?:,(?=[^\\[]*\\]))|(?:,(?=[^\\(]*\\))))*))\\)|)",x=":(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\)|)(?=[^-]|$)",y=r+"*([\\x20\\t\\r\\n\\f>+~])"+r+"*",z="(?=[^\\x20\\t\\r\\n\\f])(?:\\\\.|"+v+"|"+w.replace(2,7)+"|[^\\\\(),])+",A=new RegExp("^"+r+"+|((?:^|[^\\\\])(?:\\\\.)*)"+r+"+$","g"),B=new RegExp("^"+y),C=new RegExp(z+"?(?="+r+"*,|$)","g"),D=new RegExp("^(?:(?!,)(?:(?:^|,)"+r+"*"+z+")*?|"+r+"*(.*?))(\\)|$)"),E=new RegExp(z.slice(19,-6)+"\\x20\\t\\r\\n\\f>+~])+|"+y,"g"),F=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,G=/[\x20\t\r\n\f]*[+~]/,H=/:not\($/,I=/h\d/i,J=/input|select|textarea|button/i,K=/\\(?!\\)/g,L={ID:new RegExp("^#("+s+")"),CLASS:new RegExp("^\\.("+s+")"),NAME:new RegExp("^\\[name=['\"]?("+s+")['\"]?\\]"),TAG:new RegExp("^("+s.replace("[-","[-\\*")+")"),ATTR:new RegExp("^"+v),PSEUDO:new RegExp("^"+w),CHILD:new RegExp("^:(only|nth|last|first)-child(?:\\("+r+"*(even|odd|(([+-]|)(\\d*)n|)"+r+"*(?:([+-]|)"+r+"*(\\d+)|))"+r+"*\\)|)","i"),POS:new RegExp(x,"ig"),needsContext:new RegExp("^"+r+"*[>+~]|"+x,"i")},M={},N=[],O={},P=[],Q=function(a){return a.sizzleFilter=!0,a},R=function(a){return function(b){return b.nodeName.toLowerCase()==="input"&&b.type===a}},S=function(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}},T=function(a){var b=!1,c=h.createElement("div");try{b=a(c)}catch(d){}return c=null,b},U=T(function(a){a.innerHTML="";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),V=T(function(a){a.id=q+0,a.innerHTML="
    ",i.insertBefore(a,i.firstChild);var b=h.getElementsByName&&h.getElementsByName(q).length===2+h.getElementsByName(q+0).length;return g=!h.getElementById(q),i.removeChild(a),b}),W=T(function(a){return a.appendChild(h.createComment("")),a.getElementsByTagName("*").length===0}),X=T(function(a){return a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!==j&&a.firstChild.getAttribute("href")==="#"}),Y=T(function(a){return a.innerHTML="",!a.getElementsByClassName||a.getElementsByClassName("e").length===0?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length!==1)}),Z=function(a,b,c,d){c=c||[],b=b||h;var e,f,g,i,j=b.nodeType;if(j!==1&&j!==9)return[];if(!a||typeof a!="string")return c;g=ba(b);if(!g&&!d)if(e=F.exec(a))if(i=e[1]){if(j===9){f=b.getElementById(i);if(!f||!f.parentNode)return c;if(f.id===i)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(i))&&bb(b,f)&&f.id===i)return c.push(f),c}else{if(e[2])return o.apply(c,n.call(b.getElementsByTagName(a),0)),c;if((i=e[3])&&Y&&b.getElementsByClassName)return o.apply(c,n.call(b.getElementsByClassName(i),0)),c}return bm(a,b,c,d,g)},$=Z.selectors={cacheLength:50,match:L,order:["ID","TAG"],attrHandle:{},createPseudo:Q,find:{ID:g?function(a,b,c){if(typeof b.getElementById!==j&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==j&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==j&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:W?function(a,b){if(typeof b.getElementsByTagName!==j)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(K,""),a[3]=(a[4]||a[5]||"").replace(K,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||Z.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&Z.error(a[0]),a},PSEUDO:function(a){var b,c=a[4];return L.CHILD.test(a[0])?null:(c&&(b=D.exec(c))&&b.pop()&&(a[0]=a[0].slice(0,b[0].length-c.length-1),c=b[0].slice(0,-1)),a.splice(2,3,c||a[3]),a)}},filter:{ID:g?function(a){return a=a.replace(K,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(K,""),function(b){var c=typeof b.getAttributeNode!==j&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(K,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=M[a];return b||(b=M[a]=new RegExp("(^|"+r+")"+a+"("+r+"|$)"),N.push(a),N.length>$.cacheLength&&delete M[N.shift()]),function(a){return b.test(a.className||typeof a.getAttribute!==j&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return b?function(d){var e=Z.attr(d,a),f=e+"";if(e==null)return b==="!=";switch(b){case"=":return f===c;case"!=":return f!==c;case"^=":return c&&f.indexOf(c)===0;case"*=":return c&&f.indexOf(c)>-1;case"$=":return c&&f.substr(f.length-c.length)===c;case"~=":return(" "+f+" ").indexOf(c)>-1;case"|=":return f===c||f.substr(0,c.length+1)===c+"-"}}:function(b){return Z.attr(b,a)!=null}},CHILD:function(a,b,c,d){if(a==="nth"){var e=m++;return function(a){var b,f,g=0,h=a;if(c===1&&d===0)return!0;b=a.parentNode;if(b&&(b[q]!==e||!a.sizset)){for(h=b.firstChild;h;h=h.nextSibling)if(h.nodeType===1){h.sizset=++g;if(h===a)break}b[q]=e}return f=a.sizset-d,c===0?f===0:f%c===0&&f/c>=0}}return function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b,c,d){var e=$.pseudos[a]||$.pseudos[a.toLowerCase()];return e||Z.error("unsupported pseudo: "+a),e.sizzleFilter?e(b,c,d):e}},pseudos:{not:Q(function(a,b,c){var d=bl(a.replace(A,"$1"),b,c);return function(a){return!d(a)}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!$.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},contains:Q(function(a){return function(b){return(b.textContent||b.innerText||bc(b)).indexOf(a)>-1}}),has:Q(function(a){return function(b){return Z(a,b).length>0}}),header:function(a){return I.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:R("radio"),checkbox:R("checkbox"),file:R("file"),password:R("password"),image:R("image"),submit:S("submit"),reset:S("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return J.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b,c){return c?a.slice(1):[a[0]]},last:function(a,b,c){var d=a.pop();return c?a:[d]},even:function(a,b,c){var d=[],e=c?1:0,f=a.length;for(;e$.cacheLength&&delete O[P.shift()],g};Z.matches=function(a,b){return Z(a,null,null,b)},Z.matchesSelector=function(a,b){return Z(b,null,null,[a]).length>0};var bm=function(a,b,e,f,g){a=a.replace(A,"$1");var h,i,j,k,l,m,p,q,r,s=a.match(C),t=a.match(E),u=b.nodeType;if(L.POS.test(a))return bf(a,b,e,f,s);if(f)h=n.call(f,0);else if(s&&s.length===1){if(t.length>1&&u===9&&!g&&(s=L.ID.exec(t[0]))){b=$.find.ID(s[1],b,g)[0];if(!b)return e;a=a.slice(t.shift().length)}q=(s=G.exec(t[0]))&&!s.index&&b.parentNode||b,r=t.pop(),m=r.split(":not")[0];for(j=0,k=$.order.length;j",a.querySelectorAll("[selected]").length||e.push("\\["+r+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),T(function(a){a.innerHTML="

    ",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+r+"*(?:\"\"|'')"),a.innerHTML="",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=e.length&&new RegExp(e.join("|")),bm=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a)))if(d.nodeType===9)try{return o.apply(f,n.call(d.querySelectorAll(a),0)),f}catch(i){}else if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){var j=d.getAttribute("id"),k=j||q,l=G.test(a)&&d.parentNode||d;j?k=k.replace(c,"\\$&"):d.setAttribute("id",k);try{return o.apply(f,n.call(l.querySelectorAll(a.replace(C,"[id='"+k+"'] $&")),0)),f}catch(i){}finally{j||d.removeAttribute("id")}}return b(a,d,f,g,h)},g&&(T(function(b){a=g.call(b,"div");try{g.call(b,"[test!='']:sizzle"),f.push($.match.PSEUDO)}catch(c){}}),f=new RegExp(f.join("|")),Z.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!ba(b)&&!f.test(c)&&(!e||!e.test(c)))try{var h=g.call(b,c);if(h||a||b.document&&b.document.nodeType!==11)return h}catch(i){}return Z(c,null,null,[b]).length>0})}(),Z.attr=p.attr,p.find=Z,p.expr=Z.selectors,p.expr[":"]=p.expr.pseudos,p.unique=Z.uniqueSort,p.text=Z.getText,p.isXMLDoc=Z.isXML,p.contains=Z.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b0)for(e=d;e=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*\s*$/g,bz={option:[1,""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X
    ","
    "]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1>");try{for(;d1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=0,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(g=b===e&&bA;(h=a[s])!=null;s++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{g=g||bk(b),l=l||g.appendChild(b.createElement("div")),h=h.replace(bo,"<$1>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]===""&&!m?l.childNodes:[];for(f=n.length-1;f>=0;--f)p.nodeName(n[f],"tbody")&&!n[f].childNodes.length&&n[f].parentNode.removeChild(n[f])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l=g.lastChild}h.nodeType?t.push(h):t=p.merge(t,h)}l&&(g.removeChild(l),h=l=g=null);if(!p.support.appendChecked)for(s=0;(h=t[s])!=null;s++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(s=0;(h=t[s])!=null;s++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[s+1,0].concat(r)),s+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^margin/,bO=new RegExp("^("+q+")(.*)$","i"),bP=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bQ=new RegExp("^([-+])=("+q+")","i"),bR={},bS={position:"absolute",visibility:"hidden",display:"block"},bT={letterSpacing:0,fontWeight:400,lineHeight:1},bU=["Top","Right","Bottom","Left"],bV=["Webkit","O","Moz","ms"],bW=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return bZ(this,!0)},hide:function(){return bZ(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bW.apply(this,arguments):this.each(function(){(c?a:bY(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bX(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bQ.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bX(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bT&&(f=bT[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(a,b){var c,d,e,f,g=getComputedStyle(a,null),h=a.style;return g&&(c=g[b],c===""&&!p.contains(a.ownerDocument.documentElement,a)&&(c=p.style(a,b)),bP.test(c)&&bN.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=c,c=g.width,h.width=d,h.minWidth=e,h.maxWidth=f)),c}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bP.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0||bH(a,"display")!=="none"?ca(a,b,d):p.swap(a,bS,function(){return ca(a,b,d)})},set:function(a,c,d){return b$(a,c,d?b_(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bP.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bU[d]+b]=e[d]||e[d-2]||e[0];return f}},bN.test(a)||(p.cssHooks[a+b].set=b$)});var cc=/%20/g,cd=/\[\]$/,ce=/\r?\n/g,cf=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,cg=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||cg.test(this.nodeName)||cf.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(ce,"\r\n")}}):{name:b.name,value:c.replace(ce,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ch(d,a[d],c,f);return e.join("&").replace(cc,"+")};var ci,cj,ck=/#.*$/,cl=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cm=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,cn=/^(?:GET|HEAD)$/,co=/^\/\//,cp=/\?/,cq=/)<[^<]*)*<\/script>/gi,cr=/([?&])_=[^&]*/,cs=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,ct=p.fn.load,cu={},cv={},cw=["*/"]+["*"];try{ci=f.href}catch(cx){ci=e.createElement("a"),ci.href="",ci=ci.href}cj=cs.exec(ci.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&ct)return ct.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("
    ").append(a.replace(cq,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cA(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cA(a,b),a},ajaxSettings:{url:ci,isLocal:cm.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cw},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cy(cu),ajaxTransport:cy(cv),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cB(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cC(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=""+(c||y),k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cl.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(ck,"").replace(co,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=cs.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]==cj[1]&&i[2]==cj[2]&&(i[3]||(i[1]==="http:"?80:443))==(cj[3]||(cj[1]==="http:"?80:443)))),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cz(cu,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!cn.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cp.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cr,"$1_="+z);l.url=A+(A===l.url?(cp.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cw+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cz(cv,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cD=[],cE=/\?/,cF=/(=)\?(?=&|$)|\?\?/,cG=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cD.pop()||p.expando+"_"+cG++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cF.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cF.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cF,"$1"+f):m?c.data=i.replace(cF,"$1"+f):k&&(c.url+=(cE.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cD.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cH,cI=a.ActiveXObject?function(){for(var a in cH)cH[a](0,1)}:!1,cJ=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cK()||cL()}:cK,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cI&&delete cH[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cJ,cI&&(cH||(cH={},p(a).unload(cI)),cH[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cM,cN,cO=/^(?:toggle|show|hide)$/,cP=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cQ=/queueHooks$/,cR=[cX],cS={"*":[function(a,b){var c,d,e,f=this.createTween(a,b),g=cP.exec(b),h=f.cur(),i=+h||0,j=1;if(g){c=+g[2],d=g[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&i){i=p.css(f.elem,a,!0)||c||1;do e=j=j||".5",i=i/j,p.style(f.elem,a,i+d),j=f.cur()/h;while(j!==1&&j!==e)}f.unit=d,f.start=i,f.end=g[1]?i+(g[1]+1)*c:c}return f}]};p.Animation=p.extend(cV,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c$.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c$.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=c_(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window); \ No newline at end of file diff --git a/django_mongoengine/mongo_admin/templates/admin/change_document_list.html b/django_mongoengine/mongo_admin/templates/admin/change_document_list.html new file mode 100644 index 0000000..96f1fb5 --- /dev/null +++ b/django_mongoengine/mongo_admin/templates/admin/change_document_list.html @@ -0,0 +1,13 @@ + +{% extends "admin/change_list.html" %} + +{% load documenttags %} +{% load admin_list %} +{% load mongoadmintags %} + +{% block result_list %} + {% check_grappelli as is_grappelli %} + {% if not is_grappelli and action_form and actions_on_top and cl.full_result_count %}{% admin_actions %}{% endif %} + {% document_result_list cl %} + {% if not is_grappelli and action_form and actions_on_bottom and cl.full_result_count %}{% admin_actions %}{% endif %} +{% endblock %} diff --git a/django_mongoengine/mongo_admin/templates/mongo_admin/index.html b/django_mongoengine/mongo_admin/templates/mongo_admin/index.html new file mode 100644 index 0000000..d7909be --- /dev/null +++ b/django_mongoengine/mongo_admin/templates/mongo_admin/index.html @@ -0,0 +1,4 @@ +{% extends "admin/index.html" %} +{% block sidebar %} +{# disable LogEntry display #} +{% endblock %} diff --git a/django_mongoengine/mongo_admin/templatetags/__init__.py b/django_mongoengine/mongo_admin/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django_mongoengine/mongo_admin/templatetags/documenttags.py b/django_mongoengine/mongo_admin/templatetags/documenttags.py new file mode 100644 index 0000000..c6912a5 --- /dev/null +++ b/django_mongoengine/mongo_admin/templatetags/documenttags.py @@ -0,0 +1,60 @@ +from django.template import Library + +from django.contrib.admin.templatetags.admin_list import (result_hidden_fields, ResultList, items_for_result, + result_headers) +from django.db.models.fields import FieldDoesNotExist + +from django_mongoengine.forms.utils import patch_document + +register = Library() + +def serializable_value(self, field_name): + """ + Returns the value of the field name for this instance. If the field is + a foreign key, returns the id value, instead of the object. If there's + no Field object with this name on the model, the model attribute's + value is returned directly. + + Used to serialize a field's value (in the serializer, or form output, + for example). Normally, you would just access the attribute directly + and not use this method. + """ + try: + field = self._meta.get_field_by_name(field_name)[0] + except FieldDoesNotExist: + return getattr(self, field_name) + return getattr(self, field.name) + +def results(cl): + """ + Just like the one from Django. Only we add a serializable_value method to + the document, because Django expects it and mongoengine doesn't have it. + """ + if cl.formset: + for res, form in zip(cl.result_list, cl.formset.forms): + patch_document(serializable_value, res) + yield ResultList(form, items_for_result(cl, res, form)) + else: + for res in cl.result_list: + patch_document(serializable_value, res) + yield ResultList(None, items_for_result(cl, res, None)) + +def document_result_list(cl): + """ + Displays the headers and data list together + """ + headers = list(result_headers(cl)) + try: + num_sorted_fields = 0 + for h in headers: + if h['sortable'] and h['sorted']: + num_sorted_fields += 1 + except KeyError: + pass + + return {'cl': cl, + 'result_hidden_fields': list(result_hidden_fields(cl)), + 'result_headers': headers, + 'num_sorted_fields': num_sorted_fields, + 'results': list(results(cl))} +result_list = register.inclusion_tag("admin/change_list_results.html")(document_result_list) diff --git a/django_mongoengine/mongo_admin/templatetags/mongoadmintags.py b/django_mongoengine/mongo_admin/templatetags/mongoadmintags.py new file mode 100644 index 0000000..4145b1e --- /dev/null +++ b/django_mongoengine/mongo_admin/templatetags/mongoadmintags.py @@ -0,0 +1,33 @@ +from django import template +from django.conf import settings + +register = template.Library() + +class CheckGrappelli(template.Node): + def __init__(self, var_name): + self.var_name = var_name + def render(self, context): + context[self.var_name] = 'grappelli' in settings.INSTALLED_APPS + return '' + +def check_grappelli(parser, token): + """ + Checks weather grappelli is in installed apps and sets a variable in the context. + Unfortunately there is no other way to find out if grappelli is used or not. + See: https://github.com/sehmaschine/django-grappelli/issues/32 + + Usage: {% check_grappelli as %} + """ + + bits = token.contents.split() + + if len(bits) != 3: + raise template.TemplateSyntaxError("'check_grappelli' tag takes exactly two arguments.") + + if bits[1] != 'as': + raise template.TemplateSyntaxError("The second argument to 'check_grappelli' must be 'as'") + varname = bits[2] + + return CheckGrappelli(varname) + +register.tag(check_grappelli) diff --git a/django_mongoengine/mongo_admin/util.py b/django_mongoengine/mongo_admin/util.py new file mode 100644 index 0000000..7749ea0 --- /dev/null +++ b/django_mongoengine/mongo_admin/util.py @@ -0,0 +1,85 @@ +from django.utils.encoding import smart_text, smart_str +from django.forms.forms import pretty_name +from django.db.models.fields import FieldDoesNotExist +from django.utils import formats + +from mongoengine import fields + +from django_mongoengine.utils import force_text + + +class RelationWrapper(object): + """ + Wraps a document referenced from a ReferenceField with an Interface similiar to + django's ForeignKeyField.rel + """ + def __init__(self, document): + self.to = document + + +def label_for_field(name, model, model_admin=None, return_attr=False): + attr = None + try: + field = model._meta.get_field_by_name(name)[0] + label = field.name.replace('_', ' ') + except FieldDoesNotExist: + if name == "__unicode__": + label = force_text(model._meta.verbose_name) + elif name == "__str__": + label = smart_str(model._meta.verbose_name) + else: + if callable(name): + attr = name + elif model_admin is not None and hasattr(model_admin, name): + attr = getattr(model_admin, name) + elif hasattr(model, name): + attr = getattr(model, name) + else: + message = "Unable to lookup '%s' on %s" % (name, model._meta.object_name) + if model_admin: + message += " or %s" % (model_admin.__class__.__name__,) + raise AttributeError(message) + + if hasattr(attr, "short_description"): + label = attr.short_description + elif callable(attr): + if attr.__name__ == "": + label = "--" + else: + label = pretty_name(attr.__name__) + else: + label = pretty_name(name) + if return_attr: + return (label, attr) + else: + return label + + +def display_for_field(value, field): + from django.contrib.admin.templatetags.admin_list import _boolean_icon + from django.contrib.admin.views.main import EMPTY_CHANGELIST_VALUE + + # if field.flatchoices: + # return dict(field.flatchoices).get(value, EMPTY_CHANGELIST_VALUE) + # NullBooleanField needs special-case null-handling, so it comes + # before the general null test. + if isinstance(field, fields.BooleanField): + return _boolean_icon(value) + elif value is None: + return EMPTY_CHANGELIST_VALUE + elif isinstance(field, fields.DateTimeField): + return formats.localize(value) + elif isinstance(field, fields.DecimalField): + return formats.number_format(value, field.decimal_places) + elif isinstance(field, fields.FloatField): + return formats.number_format(value) + else: + return smart_text(value) + + +def help_text_for_field(name, model): + try: + help_text = model._meta.get_field_by_name(name)[0].help_text + except FieldDoesNotExist: + help_text = "" + return smart_text(help_text, strings_only=True) diff --git a/django_mongoengine/mongo_admin/validation.py b/django_mongoengine/mongo_admin/validation.py new file mode 100644 index 0000000..c2fc1ae --- /dev/null +++ b/django_mongoengine/mongo_admin/validation.py @@ -0,0 +1,413 @@ +from django.contrib.admin.options import flatten_fieldsets, HORIZONTAL, VERTICAL +from django.contrib.admin import ModelAdmin +from django.core.exceptions import ImproperlyConfigured +from django.db import models +from django.forms.models import BaseModelForm, _get_foreign_key, fields_for_model + +from django_mongoengine.forms.documents import BaseDocumentFormSet +from django_mongoengine.forms.document_options import DocumentMetaWrapper + +from mongoengine.fields import ListField, EmbeddedDocumentField, ReferenceField +from mongoengine.base import BaseDocument + +from .options import BaseDocumentAdmin, EmbeddedDocumentAdmin + +__all__ = ['validate'] + + +def validate(cls, model): + if issubclass(model, models.Model): + ModelAdmin.check(model) + else: + _validate(cls, model) + + +def _validate(cls, model): + """ + Does basic ModelAdmin option validation. Calls custom validation + classmethod in the end if it is provided in cls. The signature of the + custom validation classmethod should be: def validate(cls, model). + """ + # Before we can introspect models, they need to be fully loaded so that + # inter-relations are set up correctly. We force that here. + #models.get_apps() + + opts = model._meta + validate_base(cls, model) + + # list_display + if hasattr(cls, 'list_display'): + check_isseq(cls, 'list_display', cls.list_display) + for idx, field in enumerate(cls.list_display): + if not callable(field): + if not hasattr(cls, field): + if not hasattr(model, field): + try: + opts.get_field(field) + except models.FieldDoesNotExist: + raise ImproperlyConfigured("%s.list_display[%d], %r is not a callable or an attribute of %r or found in the model %r." + % (cls.__name__, idx, field, cls.__name__, model._meta.object_name)) + else: + # getattr(model, field) could be an X_RelatedObjectsDescriptor + f = fetch_attr(cls, model, opts, "list_display[%d]" % idx, field) + if isinstance(f, models.ManyToManyField): + raise ImproperlyConfigured("'%s.list_display[%d]', '%s' is a ManyToManyField which is not supported." + % (cls.__name__, idx, field)) + + # list_display_links + if hasattr(cls, 'list_display_links'): + check_isseq(cls, 'list_display_links', cls.list_display_links) + for idx, field in enumerate(cls.list_display_links): + if field not in cls.list_display: + raise ImproperlyConfigured("'%s.list_display_links[%d]' " + "refers to '%s' which is not defined in 'list_display'." + % (cls.__name__, idx, field)) + + # list_filter + if hasattr(cls, 'list_filter'): + check_isseq(cls, 'list_filter', cls.list_filter) + #for idx, fpath in enumerate(cls.list_filter): + # print idx + # print fpath + # try: + # get_fields_from_path(model, fpath) + # except (NotRelationField, FieldDoesNotExist), e: + # raise ImproperlyConfigured( + # "'%s.list_filter[%d]' refers to '%s' which does not refer to a Field." % ( + ## cls.__name__, idx, fpath + # ) + # ) + + # list_per_page = 100 + if hasattr(cls, 'list_per_page') and not isinstance(cls.list_per_page, int): + raise ImproperlyConfigured("'%s.list_per_page' should be a integer." + % cls.__name__) + + # list_editable + if hasattr(cls, 'list_editable') and cls.list_editable: + check_isseq(cls, 'list_editable', cls.list_editable) + for idx, field_name in enumerate(cls.list_editable): + try: + field = opts.get_field_by_name(field_name)[0] + except models.FieldDoesNotExist: + raise ImproperlyConfigured("'%s.list_editable[%d]' refers to a " + "field, '%s', not defined on %s." + % (cls.__name__, idx, field_name, model.__name__)) + if field_name not in cls.list_display: + raise ImproperlyConfigured("'%s.list_editable[%d]' refers to " + "'%s' which is not defined in 'list_display'." + % (cls.__name__, idx, field_name)) + if field_name in cls.list_display_links: + raise ImproperlyConfigured("'%s' cannot be in both '%s.list_editable'" + " and '%s.list_display_links'" + % (field_name, cls.__name__, cls.__name__)) + if not cls.list_display_links and cls.list_display[0] in cls.list_editable: + raise ImproperlyConfigured("'%s.list_editable[%d]' refers to" + " the first field in list_display, '%s', which can't be" + " used unless list_display_links is set." + % (cls.__name__, idx, cls.list_display[0])) + if not field.editable: + raise ImproperlyConfigured("'%s.list_editable[%d]' refers to a " + "field, '%s', which isn't editable through the admin." + % (cls.__name__, idx, field_name)) + + # search_fields = () + if hasattr(cls, 'search_fields'): + check_isseq(cls, 'search_fields', cls.search_fields) + + # date_hierarchy = None + if cls.date_hierarchy: + f = get_field(cls, model, opts, 'date_hierarchy', cls.date_hierarchy) + if not isinstance(f, (models.DateField, models.DateTimeField)): + raise ImproperlyConfigured("'%s.date_hierarchy is " + "neither an instance of DateField nor DateTimeField." + % cls.__name__) + + # ordering = None + if cls.ordering: + check_isseq(cls, 'ordering', cls.ordering) + for idx, field in enumerate(cls.ordering): + if field == '?' and len(cls.ordering) != 1: + raise ImproperlyConfigured("'%s.ordering' has the random " + "ordering marker '?', but contains other fields as " + "well. Please either remove '?' or the other fields." + % cls.__name__) + if field == '?': + continue + if field.startswith('-'): + field = field[1:] + # Skip ordering in the format field1__field2 (FIXME: checking + # this format would be nice, but it's a little fiddly). + if '__' in field: + continue + get_field(cls, model, opts, 'ordering[%d]' % idx, field) + + if hasattr(cls, "readonly_fields"): + check_readonly_fields(cls, model, opts) + + # list_select_related = False + # save_as = False + # save_on_top = False + for attr in ('list_select_related', 'save_as', 'save_on_top'): + if not isinstance(getattr(cls, attr), bool): + raise ImproperlyConfigured("'%s.%s' should be a boolean." + % (cls.__name__, attr)) + + + # inlines = [] + if hasattr(cls, 'inlines'): + check_isseq(cls, 'inlines', cls.inlines) + for idx, inline in enumerate(cls.inlines): + if not issubclass(inline, BaseDocumentAdmin): + raise ImproperlyConfigured("'%s.inlines[%d]' does not inherit " + "from BaseModelAdmin." % (cls.__name__, idx)) + if not inline.document: + raise ImproperlyConfigured("'document' is a required attribute " + "of '%s.inlines[%d]'." % (cls.__name__, idx)) + if not issubclass(inline.document, BaseDocument): + raise ImproperlyConfigured("'%s.inlines[%d].model' does not " + "inherit from models.Model." % (cls.__name__, idx)) + validate_base(inline, inline.document) + validate_inline(inline, cls, model) + +def validate_inline(cls, parent, parent_model): + + # model is already verified to exist and be a Model + if cls.fk_name: # default value is None + f = get_field(cls, cls.model, cls.model._meta, 'fk_name', cls.fk_name) + if not isinstance(f, models.ForeignKey): + raise ImproperlyConfigured("'%s.fk_name is not an instance of " + "models.ForeignKey." % cls.__name__) + + if not issubclass(cls, EmbeddedDocumentAdmin): + fk = _get_foreign_key(parent_model, cls.model, fk_name=cls.fk_name, can_fail=True) + else: + fk = None + + # extra = 3 + if not isinstance(cls.extra, int): + raise ImproperlyConfigured("'%s.extra' should be a integer." + % cls.__name__) + + # max_num = None + max_num = getattr(cls, 'max_num', None) + if max_num is not None and not isinstance(max_num, int): + raise ImproperlyConfigured("'%s.max_num' should be an integer or None (default)." + % cls.__name__) + + # formset + if hasattr(cls, 'formset') and not issubclass(cls.formset, BaseDocumentFormSet): + raise ImproperlyConfigured("'%s.formset' does not inherit from " + "BaseDocumentFormSet." % cls.__name__) + + # exclude + if hasattr(cls, 'exclude') and cls.exclude: + if fk and fk.name in cls.exclude: + raise ImproperlyConfigured("%s cannot exclude the field " + "'%s' - this is the foreign key to the parent model " + "%s." % (cls.__name__, fk.name, parent_model.__name__)) + + if hasattr(cls, "readonly_fields"): + check_readonly_fields(cls, cls.document, cls.document._meta) + +def validate_base(cls, model): + opts = model._meta + if isinstance(opts, dict): + opts = DocumentMetaWrapper(model) + + # raw_id_fields + if hasattr(cls, 'raw_id_fields'): + check_isseq(cls, 'raw_id_fields', cls.raw_id_fields) + for idx, field in enumerate(cls.raw_id_fields): + f = get_field(cls, model, opts, 'raw_id_fields', field) + if not isinstance(f, (models.ForeignKey, models.ManyToManyField)): + raise ImproperlyConfigured("'%s.raw_id_fields[%d]', '%s' must " + "be either a ForeignKey or ManyToManyField." + % (cls.__name__, idx, field)) + + # fields + if cls.fields: # default value is None + check_isseq(cls, 'fields', cls.fields) + for field in cls.fields: + if field in cls.readonly_fields: + # Stuff can be put in fields that isn't actually a model field + # if it's in readonly_fields, readonly_fields will handle the + # validation of such things. + continue + check_formfield(cls, model, opts, 'fields', field) + try: + f = opts.get_field(field) + except models.FieldDoesNotExist: + # If we can't find a field on the model that matches, + # it could be an extra field on the form. + continue + if isinstance(f, models.ManyToManyField) and not f.rel.through._meta.auto_created: + raise ImproperlyConfigured("'%s.fields' can't include the ManyToManyField " + "field '%s' because '%s' manually specifies " + "a 'through' model." % (cls.__name__, field, field)) + if cls.fieldsets: + raise ImproperlyConfigured('Both fieldsets and fields are specified in %s.' % cls.__name__) + if len(cls.fields) > len(set(cls.fields)): + raise ImproperlyConfigured('There are duplicate field(s) in %s.fields' % cls.__name__) + + # fieldsets + if cls.fieldsets: # default value is None + check_isseq(cls, 'fieldsets', cls.fieldsets) + for idx, fieldset in enumerate(cls.fieldsets): + check_isseq(cls, 'fieldsets[%d]' % idx, fieldset) + if len(fieldset) != 2: + raise ImproperlyConfigured("'%s.fieldsets[%d]' does not " + "have exactly two elements." % (cls.__name__, idx)) + check_isdict(cls, 'fieldsets[%d][1]' % idx, fieldset[1]) + if 'fields' not in fieldset[1]: + raise ImproperlyConfigured("'fields' key is required in " + "%s.fieldsets[%d][1] field options dict." + % (cls.__name__, idx)) + for fields in fieldset[1]['fields']: + # The entry in fields might be a tuple. If it is a standalone + # field, make it into a tuple to make processing easier. + if type(fields) != tuple: + fields = (fields,) + for field in fields: + if field in cls.readonly_fields: + # Stuff can be put in fields that isn't actually a + # model field if it's in readonly_fields, + # readonly_fields will handle the validation of such + # things. + continue + check_formfield(cls, model, opts, "fieldsets[%d][1]['fields']" % idx, field) + try: + f = opts.get_field(field) + if isinstance(f, models.ManyToManyField) and not f.rel.through._meta.auto_created: + raise ImproperlyConfigured("'%s.fieldsets[%d][1]['fields']' " + "can't include the ManyToManyField field '%s' because " + "'%s' manually specifies a 'through' model." % ( + cls.__name__, idx, field, field)) + except models.FieldDoesNotExist: + # If we can't find a field on the model that matches, + # it could be an extra field on the form. + pass + flattened_fieldsets = flatten_fieldsets(cls.fieldsets) + if len(flattened_fieldsets) > len(set(flattened_fieldsets)): + raise ImproperlyConfigured('There are duplicate field(s) in %s.fieldsets' % cls.__name__) + + # exclude + if cls.exclude: # default value is None + check_isseq(cls, 'exclude', cls.exclude) + for field in cls.exclude: + check_formfield(cls, model, opts, 'exclude', field) + try: + f = opts.get_field(field) + except models.FieldDoesNotExist: + # If we can't find a field on the model that matches, + # it could be an extra field on the form. + continue + if len(cls.exclude) > len(set(cls.exclude)): + raise ImproperlyConfigured('There are duplicate field(s) in %s.exclude' % cls.__name__) + + if hasattr(cls, 'form') and not ( + issubclass(cls.form, BaseModelForm) or + cls.form.__class__.__name__ == 'DocumentFormMetaclass'): + raise ImproperlyConfigured("%s.form does not inherit from " + "BaseModelForm." % cls.__name__) + + # filter_vertical + if hasattr(cls, 'filter_vertical'): + check_isseq(cls, 'filter_vertical', cls.filter_vertical) + for idx, field in enumerate(cls.filter_vertical): + f = get_field(cls, model, opts, 'filter_vertical', field) + if not isinstance(f, models.ManyToManyField): + raise ImproperlyConfigured("'%s.filter_vertical[%d]' must be " + "a ManyToManyField." % (cls.__name__, idx)) + + # filter_horizontal + if hasattr(cls, 'filter_horizontal'): + check_isseq(cls, 'filter_horizontal', cls.filter_horizontal) + for idx, field in enumerate(cls.filter_horizontal): + f = get_field(cls, model, opts, 'filter_horizontal', field) + if not isinstance(f, ListField) and not isinstance(f.field, ReferenceField): + raise ImproperlyConfigured("'%s.filter_horizontal[%d]' must be " + "a ManyToManyField." % (cls.__name__, idx)) + + # radio_fields + if hasattr(cls, 'radio_fields'): + check_isdict(cls, 'radio_fields', cls.radio_fields) + for field, val in cls.radio_fields.items(): + f = get_field(cls, model, opts, 'radio_fields', field) + if not (isinstance(f, models.ForeignKey) or f.choices): + raise ImproperlyConfigured("'%s.radio_fields['%s']' " + "is neither an instance of ForeignKey nor does " + "have choices set." % (cls.__name__, field)) + if not val in (HORIZONTAL, VERTICAL): + raise ImproperlyConfigured("'%s.radio_fields['%s']' " + "is neither admin.HORIZONTAL nor admin.VERTICAL." + % (cls.__name__, field)) + + # prepopulated_fields + if hasattr(cls, 'prepopulated_fields'): + check_isdict(cls, 'prepopulated_fields', cls.prepopulated_fields) + for field, val in cls.prepopulated_fields.items(): + f = get_field(cls, model, opts, 'prepopulated_fields', field) + if isinstance(f, (models.DateTimeField, models.ForeignKey, + models.ManyToManyField)): + raise ImproperlyConfigured("'%s.prepopulated_fields['%s']' " + "is either a DateTimeField, ForeignKey or " + "ManyToManyField. This isn't allowed." + % (cls.__name__, field)) + check_isseq(cls, "prepopulated_fields['%s']" % field, val) + for idx, f in enumerate(val): + get_field(cls, model, opts, "prepopulated_fields['%s'][%d]" % (field, idx), f) + +def check_isseq(cls, label, obj): + if not isinstance(obj, (list, tuple)): + raise ImproperlyConfigured("'%s.%s' must be a list or tuple." % (cls.__name__, label)) + +def check_isdict(cls, label, obj): + if not isinstance(obj, dict): + raise ImproperlyConfigured("'%s.%s' must be a dictionary." % (cls.__name__, label)) + +def get_field(cls, model, opts, label, field): + try: + return opts.get_field(field) + except models.FieldDoesNotExist: + raise ImproperlyConfigured("'%s.%s' refers to field '%s' that is missing from model '%s'." + % (cls.__name__, label, field, model.__name__)) + +def check_formfield(cls, model, opts, label, field): + if getattr(cls.form, 'base_fields', None): + try: + cls.form.base_fields[field] + except KeyError: + raise ImproperlyConfigured("'%s.%s' refers to field '%s' that " + "is missing from the form." % (cls.__name__, label, field)) + else: + fields = fields_for_model(model) + try: + fields[field] + except KeyError: + if hasattr(model, field) and isinstance(getattr(model, field), ListField): + if isinstance(model._fields[field].field, EmbeddedDocumentField): + return + if hasattr(model, field) and isinstance(getattr(model, field), EmbeddedDocumentField): + return + raise ImproperlyConfigured("'%s.%s' refers to field '%s' that " + "is missing from the form." % (cls.__name__, label, field)) + +def fetch_attr(cls, model, opts, label, field): + try: + return getattr(model, field) + except AttributeError: + raise ImproperlyConfigured("'%s.%s' refers to '%s' that is neither a field, method or property of model '%s'." + % (cls.__name__, label, field, model.__name__)) + +def check_readonly_fields(cls, model, opts): + check_isseq(cls, "readonly_fields", cls.readonly_fields) + for idx, field in enumerate(cls.readonly_fields): + if not callable(field): + if not hasattr(cls, field): + if not hasattr(model, field): + try: + opts.get_field(field) + except models.FieldDoesNotExist: + raise ImproperlyConfigured("%s.readonly_fields[%d], %r is not a callable or an attribute of %r or found in the model %r." + % (cls.__name__, idx, field, cls.__name__, model._meta.object_name)) diff --git a/django_mongoengine/mongo_admin/views.py b/django_mongoengine/mongo_admin/views.py new file mode 100644 index 0000000..9dc0014 --- /dev/null +++ b/django_mongoengine/mongo_admin/views.py @@ -0,0 +1,213 @@ +import operator + +from django.core.exceptions import SuspiciousOperation, ImproperlyConfigured +from django.contrib.admin.views.main import ( + ChangeList, ORDER_VAR, ALL_VAR, ORDER_TYPE_VAR, SEARCH_VAR, IS_POPUP_VAR, + TO_FIELD_VAR) +from django.contrib.admin.options import IncorrectLookupParameters +from django.core.paginator import InvalidPage +from django.utils.encoding import smart_str + +from mongoengine import Q + + +class DocumentChangeList(ChangeList): + def __init__(self, request, model, list_display, list_display_links, + list_filter, date_hierarchy, search_fields, list_select_related, + list_per_page, list_max_show_all, list_editable, model_admin): + try: + super(DocumentChangeList, self).__init__( + request, model, list_display, list_display_links, list_filter, + date_hierarchy, search_fields, list_select_related, + list_per_page, list_max_show_all, list_editable, model_admin) + except TypeError: + self.list_max_show_all = list_max_show_all + # The init for django <= 1.3 takes one parameter less + super(DocumentChangeList, self).__init__( + request, model, list_display, list_display_links, list_filter, + date_hierarchy, search_fields, list_select_related, + list_per_page, list_editable, model_admin) + self.pk_attname = self.lookup_opts.pk_name + + def get_results(self, request): + paginator = self.model_admin.get_paginator(request, self.query_set, + self.list_per_page) + # Get the number of objects, with admin filters applied. + result_count = paginator.count + + # Get the total number of objects, with no admin filters applied. + # Perform a slight optimization: Check to see whether any filters were + # given. If not, use paginator.hits to calculate the number of objects, + # because we've already done paginator.hits and the value is cached. + if len(self.query_set._query) == 1: + full_result_count = result_count + else: + full_result_count = self.root_query_set.count() + + can_show_all = result_count <= self.list_max_show_all + multi_page = result_count > self.list_per_page + + # Get the list of objects to display on this page. + if (self.show_all and can_show_all) or not multi_page: + result_list = self.query_set.clone() + else: + try: + result_list = paginator.page(self.page_num+1).object_list + except InvalidPage: + raise IncorrectLookupParameters + + self.result_count = result_count + self.full_result_count = full_result_count + self.result_list = result_list + self.can_show_all = can_show_all + self.multi_page = multi_page + self.paginator = paginator + + def _get_default_ordering(self): + try: + ordering = super(DocumentChangeList, self)._get_default_ordering() + except AttributeError: + ordering = [] + if self.model_admin.ordering: + ordering = self.model_admin.ordering + elif self.lookup_opts.ordering: + ordering = self.lookup_opts.ordering + return ordering + + def get_ordering(self, request=None, queryset=None): + """ + Returns the list of ordering fields for the change list. + First we check the get_ordering() method in model admin, then we check + the object's default ordering. Then, any manually-specified ordering + from the query string overrides anything. Finally, a deterministic + order is guaranteed by ensuring the primary key is used as the last + ordering field. + """ + if queryset is None: + # with Django < 1.4 get_ordering works without fixes for mongoengine + return super(DocumentChangeList, self).get_ordering() + + params = self.params + ordering = list(self.model_admin.get_ordering(request) + or self._get_default_ordering()) + if ORDER_VAR in params: + # Clear ordering and used params + ordering = [] + order_params = params[ORDER_VAR].split('.') + for p in order_params: + try: + none, pfx, idx = p.rpartition('-') + field_name = self.list_display[int(idx)] + order_field = self.get_ordering_field(field_name) + if not order_field: + continue # No 'admin_order_field', skip it + ordering.append(pfx + order_field) + except (IndexError, ValueError): + continue # Invalid ordering specified, skip it. + + # Add the given query's ordering fields, if any. + sign = lambda t: t[1] > 0 and '+' or '-' + qs_ordering = [sign(t) + t[0] for t in queryset._ordering] + ordering.extend(qs_ordering) + + # Ensure that the primary key is systematically present in the list of + # ordering fields so we can guarantee a deterministic order across all + # database backends. + pk_name = self.lookup_opts.pk.name + if not (set(ordering) & set(['pk', '-pk', pk_name, '-' + pk_name])): + # The two sets do not intersect, meaning the pk isn't present. So + # we add it. + ordering.append('pk') + return ordering + + def _lookup_param_1_3(self): + lookup_params = self.params.copy() # a dictionary of the query string + for i in (ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR, + IS_POPUP_VAR, TO_FIELD_VAR): + if i in lookup_params: + del lookup_params[i] + for key, value in lookup_params.items(): + if not isinstance(key, str): + # 'key' will be used as a keyword argument later, so Python + # requires it to be a string. + del lookup_params[key] + lookup_params[smart_str(key)] = value + + # if key ends with __in, split parameter into separate values + if key.endswith('__in'): + value = value.split(',') + lookup_params[key] = value + + # if key ends with __isnull, special case '' and false + if key.endswith('__isnull'): + if value.lower() in ('', 'false'): + value = False + else: + value = True + lookup_params[key] = value + + if not self.model_admin.lookup_allowed(key, value): + raise SuspiciousOperation( + "Filtering by %s not allowed" % key + ) + return lookup_params + + def get_query_set(self, request=None): + # First, we collect all the declared list filters. + qs = self.root_query_set.clone() + + try: + (self.filter_specs, self.has_filters, remaining_lookup_params, + use_distinct) = self.get_filters(request) + + # Then, we let every list filter modify the queryset to its liking. + for filter_spec in self.filter_specs: + new_qs = filter_spec.queryset(request, qs) + if new_qs is not None: + qs = new_qs + except ValueError: + # Django < 1.4. + remaining_lookup_params = self._lookup_param_1_3() + + try: + # Finally, we apply the remaining lookup parameters from the query + # string (i.e. those that haven't already been processed by the + # filters). + qs = qs.filter(**remaining_lookup_params) + # TODO: This should probably be mongoengine exceptions + except (SuspiciousOperation, ImproperlyConfigured): + # Allow certain types of errors to be re-raised as-is so that the + # caller can treat them in a special way. + raise + except Exception as e: + # Every other error is caught with a naked except, because we don't + # have any other way of validating lookup parameters. They might be + # invalid if the keyword arguments are incorrect, or if the values + # are not in the correct type, so we might get FieldError, + # ValueError, ValidationError, or ?. + raise IncorrectLookupParameters(e) + + # Set ordering. + ordering = self.get_ordering(request, qs) + qs = qs.order_by(*ordering) + + # Apply keyword searches. + def construct_search(field_name): + if field_name.startswith('^'): + return "%s__istartswith" % field_name[1:] + elif field_name.startswith('='): + return "%s__iexact" % field_name[1:] + # No __search for mongoengine + #elif field_name.startswith('@'): + # return "%s__search" % field_name[1:] + else: + return "%s__icontains" % field_name + + if self.search_fields and self.query: + orm_lookups = [construct_search(str(search_field)) + for search_field in self.search_fields] + for bit in self.query.split(): + or_queries = [Q(**{orm_lookup: bit}) + for orm_lookup in orm_lookups] + qs = qs.filter(reduce(operator.or_, or_queries)) + return qs diff --git a/django_mongoengine/mongo_auth/__init__.py b/django_mongoengine/mongo_auth/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django_mongoengine/mongo_auth/admin.py b/django_mongoengine/mongo_auth/admin.py new file mode 100644 index 0000000..b9f4755 --- /dev/null +++ b/django_mongoengine/mongo_auth/admin.py @@ -0,0 +1,6 @@ +from django.contrib.auth.models import User, Group + +from django_mongoengine import mongo_admin + +#admin.site.unregister(Group) +#admin.site.unregister(User) diff --git a/django_mongoengine/mongo_auth/backends.py b/django_mongoengine/mongo_auth/backends.py new file mode 100644 index 0000000..48ef2eb --- /dev/null +++ b/django_mongoengine/mongo_auth/backends.py @@ -0,0 +1,17 @@ +from django.contrib import auth + + +class MongoEngineBackend(object): + """Authenticate using MongoEngine and mongoengine.django.auth.User. + """ + + supports_object_permissions = False + supports_anonymous_user = False + supports_inactive_user = False + + authenticate = auth.backends.ModelBackend.__dict__["authenticate"] + get_user = auth.backends.ModelBackend.__dict__["get_user"] + try: + user_can_authenticate = auth.backends.ModelBackend.__dict__["user_can_authenticate"] + except KeyError: + pass # it's okay for django < 1.9 diff --git a/django_mongoengine/mongo_auth/managers.py b/django_mongoengine/mongo_auth/managers.py new file mode 100644 index 0000000..d2bc20d --- /dev/null +++ b/django_mongoengine/mongo_auth/managers.py @@ -0,0 +1,106 @@ +from importlib import import_module + +from django.conf import settings +from django.contrib.auth.models import UserManager +from django.db.models import CharField, BooleanField, DateTimeField, DateField +from django.utils import timezone +from django.utils.translation import ugettext_lazy as _ +from mongoengine.errors import DoesNotExist + + +MONGOENGINE_USER_DOCUMENT = getattr( + settings, 'MONGOENGINE_USER_DOCUMENT', 'django_mongoengine.mongo_auth.models.User') + + +def get_user_document(): + """Get the user document class used for authentication. + + This is the class defined in settings.MONGOENGINE_USER_DOCUMENT, which + defaults to `mongoengine.django.auth.User`. + + """ + + name = MONGOENGINE_USER_DOCUMENT + dot = name.rindex('.') + module = import_module(name[:dot]) + return getattr(module, name[dot + 1:]) + + +class MongoUserManager(UserManager): + """A User manager wich allows the use of MongoEngine documents in Django. + + To use the manager, you must tell django.contrib.auth to use MongoUser as + the user model. In you settings.py, you need: + + INSTALLED_APPS = ( + ... + 'django.contrib.auth', + 'django_mongoengine.mongo_auth', + ... + ) + AUTH_USER_MODEL = 'mongo_auth.MongoUser' + + Django will use the model object to access the custom Manager, which will + replace the original queryset with MongoEngine querysets. + + By default, `mongo_auth.User` will be used to store users. You + can specify another document class in MONGOENGINE_USER_DOCUMENT in your + settings.py. + + The User Document class has the same requirements as a standard custom user + model: https://docs.djangoproject.com/en/dev/topics/auth/customizing/ + + In particular, the User Document class must define USERNAME_FIELD and + REQUIRED_FIELDS. + """ + + def contribute_to_class(self, model, name): + super(MongoUserManager, self).contribute_to_class(model, name) + self.dj_model = self.model + self.model = get_user_document() + + self.dj_model.USERNAME_FIELD = self.model.USERNAME_FIELD + username = CharField(_('username'), max_length=30, unique=True) + username.contribute_to_class(self.dj_model, self.dj_model.USERNAME_FIELD) + + self.dj_model.REQUIRED_FIELDS = self.model.REQUIRED_FIELDS + for name in self.dj_model.REQUIRED_FIELDS: + field = CharField(_(name), max_length=30) + field.contribute_to_class(self.dj_model, name) + + is_staff = BooleanField(_('is_staff'), default=False) + is_staff.contribute_to_class(self.dj_model, 'is_staff') + + is_active = BooleanField(_('is_active'), default=False) + is_active.contribute_to_class(self.dj_model, 'is_active') + + is_superuser = BooleanField(_('is_superuser'), default=False) + is_superuser.contribute_to_class(self.dj_model, 'is_superuser') + + last_login = DateTimeField(_('last_login'), auto_now_add=True) + last_login.contribute_to_class(self.dj_model, 'last_login') + + date_joined = DateTimeField(_('date_joined'), auto_now_add=True) + date_joined.contribute_to_class(self.dj_model, 'date_joined') + + + def get(self, *args, **kwargs): + try: + return self.get_queryset().get(*args, **kwargs) + except DoesNotExist: + # ModelBackend expects this exception + raise self.dj_model.DoesNotExist + + @property + def db(self): + raise NotImplementedError + + def get_queryset(self): + return get_user_document().objects + + def create_superuser(self, username, email, password, **extra_fields): + """since we use mongo as our database, we don't use + django's rule to create a superuser, such as 'python manage.py createsuperuser'. + We use mongo's rule --'python manage.py createmongosuperuser instead. + """ + return get_user_document().create_superuser(username, password, email) diff --git a/django_mongoengine/mongo_auth/models.py b/django_mongoengine/mongo_auth/models.py new file mode 100644 index 0000000..e5d8ad0 --- /dev/null +++ b/django_mongoengine/mongo_auth/models.py @@ -0,0 +1,398 @@ +from django.utils.encoding import smart_str +from django.utils.translation import ugettext_lazy as _ +from django.utils import timezone +from django.conf import settings +from django.contrib.auth.models import ( + AbstractBaseUser, + _user_has_perm, _user_get_all_permissions, _user_has_module_perms, +) +from django.db import models +from django.contrib.contenttypes.models import ContentTypeManager +from django.contrib import auth + +from bson.objectid import ObjectId +from mongoengine import ImproperlyConfigured + +from django_mongoengine import document +from django_mongoengine import fields +from .managers import MongoUserManager + +try: + from django.contrib.auth.hashers import check_password, make_password +except ImportError: + """Handle older versions of Django""" + from django.utils.hashcompat import md5_constructor, sha_constructor + + def get_hexdigest(algorithm, salt, raw_password): + raw_password, salt = smart_str(raw_password), smart_str(salt) + if algorithm == 'md5': + return md5_constructor(salt + raw_password).hexdigest() + elif algorithm == 'sha1': + return sha_constructor(salt + raw_password).hexdigest() + raise ValueError('Got unknown password algorithm type in password') + + def check_password(raw_password, password): + algo, salt, hash = password.split('$') + return hash == get_hexdigest(algo, salt, raw_password) + + def make_password(raw_password): + from random import random + algo = 'sha1' + salt = get_hexdigest(algo, str(random()), str(random()))[:5] + hash = get_hexdigest(algo, salt, raw_password) + return '%s$%s$%s' % (algo, salt, hash) + + +class BaseUser(object): + + is_anonymous = AbstractBaseUser.__dict__['is_anonymous'] + is_authenticated = AbstractBaseUser.__dict__['is_authenticated'] + + +class ContentType(document.Document): + name = fields.StringField(max_length=100) + app_label = fields.StringField(max_length=100) + model = fields.StringField(max_length=100, verbose_name=_('python model class name'), + unique_with='app_label') + objects = ContentTypeManager() + + class Meta: + verbose_name = _('content type') + verbose_name_plural = _('content types') + # db_table = 'django_content_type' + # ordering = ('name',) + # unique_together = (('app_label', 'model'),) + + def __unicode__(self): + return self.name + + def model_class(self): + "Returns the Python model class for this type of content." + from django.db import models + return models.get_model(self.app_label, self.model) + + def get_object_for_this_type(self, **kwargs): + """ + Returns an object of this type for the keyword arguments given. + Basically, this is a proxy around this object_type's get_object() model + method. The ObjectNotExist exception, if thrown, will not be caught, + so code that calls this method should catch it. + """ + return self.model_class()._default_manager.using(self._state.db).get(**kwargs) + + def natural_key(self): + return (self.app_label, self.model) + + +class SiteProfileNotAvailable(Exception): + pass + + +class PermissionManager(models.Manager): + def get_by_natural_key(self, codename, app_label, model): + return self.get( + codename=codename, + content_type=ContentType.objects.get_by_natural_key(app_label, model) + ) + + +class Permission(document.Document): + """The permissions system provides a way to assign permissions to specific + users and groups of users. + + The permission system is used by the Django admin site, but may also be + useful in your own code. The Django admin site uses permissions as follows: + + - The "add" permission limits the user's ability to view the "add" + form and add an object. + - The "change" permission limits a user's ability to view the change + list, view the "change" form and change an object. + - The "delete" permission limits the ability to delete an object. + + Permissions are set globally per type of object, not per specific object + instance. It is possible to say "Mary may change news stories," but it's + not currently possible to say "Mary may change news stories, but only the + ones she created herself" or "Mary may only change news stories that have + a certain status or publication date." + + Three basic permissions -- add, change and delete -- are automatically + created for each Django model. + """ + name = fields.StringField(max_length=50, verbose_name=_('username')) + content_type = fields.ReferenceField(ContentType) + codename = fields.StringField(max_length=100, verbose_name=_('codename')) + # FIXME: don't access field of the other class + # unique_with=['content_type__app_label', 'content_type__model']) + + objects = PermissionManager() + + class Meta: + verbose_name = _('permission') + verbose_name_plural = _('permissions') + # unique_together = (('content_type', 'codename'),) + # ordering = ('content_type__app_label', 'content_type__model', 'codename') + + def __unicode__(self): + return u"%s | %s | %s" % ( + unicode(self.content_type.app_label), + unicode(self.content_type), + unicode(self.name)) + + def natural_key(self): + return (self.codename,) + self.content_type.natural_key() + natural_key.dependencies = ['contenttypes.contenttype'] + + +class Group(document.Document): + """Groups are a generic way of categorizing users to apply permissions, + or some other label, to those users. A user can belong to any number of + groups. + + A user in a group automatically has all the permissions granted to that + group. For example, if the group Site editors has the permission + can_edit_home_page, any user in that group will have that permission. + + Beyond permissions, groups are a convenient way to categorize users to + apply some label, or extended functionality, to them. For example, you + could create a group 'Special users', and you could write code that would + do special things to those users -- such as giving them access to a + members-only portion of your site, or sending them members-only + e-mail messages. + """ + name = fields.StringField(max_length=80, unique=True, verbose_name=_('name')) + permissions = fields.ListField(fields.ReferenceField(Permission, verbose_name=_('permissions'), required=False)) + + class Meta: + verbose_name = _('group') + verbose_name_plural = _('groups') + + def __unicode__(self): + return self.name + + +class AbstractUser(BaseUser, document.Document): + """A User document that aims to mirror most of the API specified by Django + at http://docs.djangoproject.com/en/dev/topics/auth/#users + """ + username = fields.StringField( + max_length=150, verbose_name=_('username'), + help_text=_("Required. 150 characters or fewer. Letters, numbers and @/./+/-/_ characters"), + ) + + first_name = fields.StringField( + max_length=30, blank=True, verbose_name=_('first name'), + ) + + last_name = fields.StringField( + max_length=30, blank=True, verbose_name=_('last name')) + email = fields.EmailField(verbose_name=_('e-mail address'), blank=True) + password = fields.StringField( + max_length=128, + verbose_name=_('password'), + help_text=_("Use '[algo]$[iterations]$[salt]$[hexdigest]' or use the change password form.")) + is_staff = fields.BooleanField( + default=False, + verbose_name=_('staff status'), + help_text=_("Designates whether the user can log into this admin site.")) + is_active = fields.BooleanField( + default=True, + verbose_name=_('active'), + help_text=_("Designates whether this user should be treated as active. Unselect this instead of deleting accounts.")) + is_superuser = fields.BooleanField( + default=False, + verbose_name=_('superuser status'), + help_text=_("Designates that this user has all permissions without explicitly assigning them.")) + last_login = fields.DateTimeField( + default=timezone.now, + verbose_name=_('last login')) + date_joined = fields.DateTimeField( + default=timezone.now, + verbose_name=_('date joined')) + + user_permissions = fields.ListField( + fields.ReferenceField(Permission), verbose_name=_('user permissions'), + blank=True, help_text=_('Permissions for the user.')) + + USERNAME_FIELD = getattr(settings, 'MONGOENGINE_USERNAME_FIELDS', 'username') + REQUIRED_FIELDS = getattr(settings, 'MONGOENGINE_USER_REQUIRED_FIELDS', ['email']) + + meta = { + 'abstract': True, + 'indexes': [ + {'fields': ['username'], 'unique': True, 'sparse': True} + ] + } + + def __unicode__(self): + return self.username + + def get_full_name(self): + """Returns the users first and last names, separated by a space. + """ + full_name = u'%s %s' % (self.first_name or '', self.last_name or '') + return full_name.strip() + + def set_password(self, raw_password): + """Sets the user's password - always use this rather than directly + assigning to :attr:`~mongoengine.django.auth.User.password` as the + password is hashed before storage. + """ + self.password = make_password(raw_password) + self.save() + return self + + def check_password(self, raw_password): + """Checks the user's password against a provided password - always use + this rather than directly comparing to + :attr:`~mongoengine.django.auth.User.password` as the password is + hashed before storage. + """ + return check_password(raw_password, self.password) + + @classmethod + def _create_user(cls, username, password, email=None, create_superuser=False): + """Create (and save) a new user with the given username, password and + email address. + """ + now = timezone.now() + + # Normalize the address by lowercasing the domain part of the email + # address. + if email is not None: + try: + email_name, domain_part = email.strip().split('@', 1) + except ValueError: + pass + else: + email = '@'.join([email_name, domain_part.lower()]) + + user = cls(username=username, email=email, date_joined=now) + user.set_password(password) + if create_superuser: + user.is_staff = True + user.is_superuser = True + user.save() + return user + + @classmethod + def create_user(cls, username, password, email=None): + return cls._create_user(username, password, email) + + @classmethod + def create_superuser(cls, username, password, email=None): + return cls._create_user(username, password, email, create_superuser=True) + + def get_group_permissions(self, obj=None): + """ + Returns a list of permission strings that this user has through his/her + groups. This method queries all available auth backends. If an object + is passed in, only permissions matching this object are returned. + """ + permissions = set() + for backend in auth.get_backends(): + if hasattr(backend, "get_group_permissions"): + permissions.update(backend.get_group_permissions(self, obj)) + return permissions + + def get_all_permissions(self, obj=None): + return _user_get_all_permissions(self, obj) + + def has_perm(self, perm, obj=None): + """ + Returns True if the user has the specified permission. This method + queries all available auth backends, but returns immediately if any + backend returns True. Thus, a user who has permission from a single + auth backend is assumed to have permission in general. If an object is + provided, permissions for this specific object are checked. + """ + + # Active superusers have all permissions. + if self.is_active and self.is_superuser: + return True + + # Otherwise we need to check the backends. + return _user_has_perm(self, perm, obj) + + def has_perms(self, perm_list, obj=None): + """ + Returns True if the user has each of the specified permissions. If + object is passed, it checks if the user has all required perms for this + object. + """ + for perm in perm_list: + if not self.has_perm(perm, obj): + return False + return True + + def has_module_perms(self, app_label): + """ + Returns True if the user has any permissions in the given app label. + Uses pretty much the same logic as has_perm, above. + """ + # Active superusers have all permissions. + if self.is_active and self.is_superuser: + return True + + return _user_has_module_perms(self, app_label) + + def email_user(self, subject, message, from_email=None): + "Sends an e-mail to this User." + from django.core.mail import send_mail + send_mail(subject, message, from_email, [self.email]) + + def get_profile(self): + """ + Returns site-specific profile for this user. Raises + SiteProfileNotAvailable if this site does not allow profiles. + """ + if not hasattr(self, '_profile_cache'): + if not getattr(settings, 'AUTH_PROFILE_MODULE', False): + raise SiteProfileNotAvailable('You need to set AUTH_PROFILE_MO' + 'DULE in your project settings') + try: + app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.') + except ValueError: + raise SiteProfileNotAvailable('app_label and model_name should' + ' be separated by a dot in the AUTH_PROFILE_MODULE set' + 'ting') + + try: + model = models.get_model(app_label, model_name) + if model is None: + raise SiteProfileNotAvailable('Unable to load the profile ' + 'model, check AUTH_PROFILE_MODULE in your project sett' + 'ings') + self._profile_cache = model._default_manager.using(self._state.db).get(user__id__exact=self.id) + self._profile_cache.user = self + except (ImportError, ImproperlyConfigured): + raise SiteProfileNotAvailable + return self._profile_cache + + +class User(AbstractUser): + meta = {'allow_inheritance': True} + + +class MongoUser(BaseUser, models.Model): + """" + Dummy user model for Django. + + MongoUser is used to replace Django's UserManager with MongoUserManager. + The actual user document class is django_mongoengine.auth.models.User or any + other document class specified in MONGOENGINE_USER_DOCUMENT. + + To get the user document class, use `get_user_document()`. + + """ + + objects = MongoUserManager() + + class Meta: + app_label = 'mongo_auth' + + def set_password(self, password): + """Doesn't do anything, but works around the issue with Django 1.6.""" + make_password(password) + + +MongoUser._meta.pk.to_python = ObjectId diff --git a/django_mongoengine/queryset.py b/django_mongoengine/queryset.py new file mode 100644 index 0000000..cff5bda --- /dev/null +++ b/django_mongoengine/queryset.py @@ -0,0 +1,102 @@ +import sys + +from django.utils import six +from django.db.models.query import QuerySet as DjangoQuerySet + +from mongoengine.errors import NotUniqueError +from mongoengine import queryset as qs + + +class QueryWrapper(object): + # XXX: copy funcs from django; now it's just wrapper + select_related = False + order_by = [] + + def __init__(self, q, ordering): + self.q = q + self.order_by = ordering or [] + + +class BaseQuerySet(object): + """ + A base queryset with django-required attributes + """ + + @property + def model(self): + return self._document + + @property + def query(self): + return QueryWrapper(self._query, self._ordering) + + @property + def _prefetch_related_lookups(self): + # Originally used in django for prefetch_related(), + # see https://docs.djangoproject.com/en/1.9/ref/models/querysets/#prefetch-related + # returning empty list to presume that no query prefetch is required + return [] + + def iterator(self): + return self + + def get_queryset(self): + return self + + def latest(self, field_name): + return self.order_by("-" + field_name).first() + + def earliest(self, field_name): + return self.order_by(field_name).first() + + def exists(self): + return bool(self) + + + def _clone(self): + return self.clone() + + @property + def ordered(self): + """ + Returns True if the QuerySet is ordered -- i.e. has an order_by() + clause or a default ordering on the model. + """ + if self._ordering: + return True + elif self._document._meta.ordering: + return True + else: + return False + + get_or_create = DjangoQuerySet.__dict__["get_or_create"] + + _extract_model_params = DjangoQuerySet.__dict__["_extract_model_params"] + + def _create_object_from_params(self, lookup, params): + """ + Tries to create an object using passed params. + Used by get_or_create and update_or_create + """ + try: + obj = self.create(**params) + return obj, True + except NotUniqueError: + exc_info = sys.exc_info() + try: + return self.get(**lookup), False + except self.model.DoesNotExist: + pass + six.reraise(*exc_info) + + +class QuerySet(BaseQuerySet, qs.QuerySet): + pass + + +class QuerySetNoCache(BaseQuerySet, qs.QuerySetNoCache): + pass + + +class QuerySetManager(qs.QuerySetManager): + default = QuerySet diff --git a/django_mongoengine/sessions.py b/django_mongoengine/sessions.py new file mode 100644 index 0000000..3b2dff4 --- /dev/null +++ b/django_mongoengine/sessions.py @@ -0,0 +1,119 @@ +import logging +from django.conf import settings +from django.contrib.sessions.backends.base import SessionBase, CreateError +from django.core.exceptions import SuspiciousOperation + +from bson import json_util + +from mongoengine.document import Document +from mongoengine import fields +from mongoengine.queryset import OperationError +from mongoengine.connection import DEFAULT_CONNECTION_NAME + +from .utils import datetime_now, force_text + + +MONGOENGINE_SESSION_DB_ALIAS = getattr( + settings, 'MONGOENGINE_SESSION_DB_ALIAS', + DEFAULT_CONNECTION_NAME) + +# a setting for the name of the collection used to store sessions +MONGOENGINE_SESSION_COLLECTION = getattr( + settings, 'MONGOENGINE_SESSION_COLLECTION', + 'django_session') + +# a setting for whether session data is stored encoded or not +MONGOENGINE_SESSION_DATA_ENCODE = getattr( + settings, 'MONGOENGINE_SESSION_DATA_ENCODE', + True) + + +class MongoSession(Document): + session_key = fields.StringField(primary_key=True, max_length=40) + session_data = fields.StringField() if MONGOENGINE_SESSION_DATA_ENCODE \ + else fields.DictField() + expire_date = fields.DateTimeField() + + meta = { + 'collection': MONGOENGINE_SESSION_COLLECTION, + 'db_alias': MONGOENGINE_SESSION_DB_ALIAS, + 'allow_inheritance': False, + 'indexes': [ + { + 'fields': ['expire_date'], + 'expireAfterSeconds': 0 + } + ] + } + + def get_decoded(self): + return SessionStore().decode(self.session_data) + + +class SessionStore(SessionBase): + """A MongoEngine-based session store for Django. + """ + + def load(self): + try: + s = MongoSession.objects(session_key=self.session_key, + expire_date__gt=datetime_now)[0] + if MONGOENGINE_SESSION_DATA_ENCODE: + return self.decode(force_text(s.session_data)) + else: + return s.session_data + except (IndexError, SuspiciousOperation) as e: + if isinstance(e, SuspiciousOperation): + logger = logging.getLogger('django.security.%s' % + e.__class__.__name__) + logger.warning(force_text(e)) + self._session_key = None + return {} + + def exists(self, session_key): + return bool(MongoSession.objects(session_key=session_key).first()) + + def create(self): + while True: + self._session_key = self._get_new_session_key() + try: + self.save(must_create=True) + except CreateError: + continue + self.modified = True + return + + def save(self, must_create=False): + if self.session_key is None: + self.create() + data = self._get_session(no_load=must_create) + s = MongoSession(session_key=self.session_key) + if MONGOENGINE_SESSION_DATA_ENCODE: + s.session_data = self.encode(data) + else: + s.session_data = data + s.expire_date = self.get_expiry_date() + try: + s.save(force_insert=must_create) + except OperationError: + if must_create: + raise CreateError + raise + + def delete(self, session_key=None): + if session_key is None: + if self.session_key is None: + return + session_key = self.session_key + MongoSession.objects(session_key=session_key).delete() + + +class BSONSerializer(object): + """ + Serializer that can handle BSON types (eg ObjectId). + """ + def dumps(self, obj): + return json_util.dumps(obj, separators=(',', ':')).encode('ascii') + + def loads(self, data): + return json_util.loads(data.decode('ascii')) diff --git a/django_mongoengine/utils/__init__.py b/django_mongoengine/utils/__init__.py new file mode 100644 index 0000000..6d21d69 --- /dev/null +++ b/django_mongoengine/utils/__init__.py @@ -0,0 +1,18 @@ +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict + +try: + # django >= 1.4 + from django.utils.timezone import now as datetime_now +except ImportError: + from datetime import datetime + datetime_now = datetime.now + +try: + # python3 and new django versions + from django.utils.encoding import force_text +except ImportError: + # some very old django versions + from django.utils.encoding import force_unicode as force_text diff --git a/django_mongoengine/utils/monkey.py b/django_mongoengine/utils/monkey.py new file mode 100644 index 0000000..a5f4357 --- /dev/null +++ b/django_mongoengine/utils/monkey.py @@ -0,0 +1,13 @@ +import imp +import importlib + +def get_patched_django_module(modname, **kwargs): + parent, m = modname.rsplit(".", 1) + path = importlib.import_module(parent).__path__ + mod = imp.load_module( + ".".join([__name__, modname.replace(".", "_")]), + *imp.find_module(m, path) + ) + for k, v in kwargs.items(): + setattr(mod, k, v) + return mod diff --git a/django_mongoengine/utils/patches.py b/django_mongoengine/utils/patches.py new file mode 100644 index 0000000..b0c026d --- /dev/null +++ b/django_mongoengine/utils/patches.py @@ -0,0 +1,18 @@ +from mongoengine.errors import FieldDoesNotExist + +def serializable_value(self, field_name): + """ + Returns the value of the field name for this instance. If the field is + a foreign key, returns the id value, instead of the object. If there's + no Field object with this name on the model, the model attribute's + value is returned directly. + + Used to serialize a field's value (in the serializer, or form output, + for example). Normally, you would just access the attribute directly + and not use this method. + """ + try: + field = self._meta.get_field(field_name) + except FieldDoesNotExist: + return getattr(self, field_name) + return getattr(self, field.name) diff --git a/django_mongoengine/utils/wrappers.py b/django_mongoengine/utils/wrappers.py new file mode 100644 index 0000000..d785a32 --- /dev/null +++ b/django_mongoengine/utils/wrappers.py @@ -0,0 +1,26 @@ +class WrapDocument(type): + """ + Wrapper for views to include wrapped `model` attribute + """ + + def __new__(cls, name, bases, attrs): + document = attrs.get("document") + if document: + try: + attrs['model'] = document + except AttributeError: + attrs['model'] = property( + lambda self: self.document + ) + return super(WrapDocument, cls).__new__(cls, name, bases, attrs) + + +def copy_class(source): + def decorator(cls): + f = lambda k: ( + k not in cls.__dict__ and not k.startswith("__") + ) + for k in filter(f, source.__dict__.keys()): + setattr(cls, k, source.__dict__[k]) + return cls + return decorator diff --git a/django_mongoengine/views/__init__.py b/django_mongoengine/views/__init__.py new file mode 100644 index 0000000..32956a7 --- /dev/null +++ b/django_mongoengine/views/__init__.py @@ -0,0 +1,13 @@ +from __future__ import absolute_import + +from .list import ListView +from .detail import DetailView +from .embedded import EmbeddedDetailView +from .edit import CreateView, UpdateView, DeleteView + +__all__ = [ + "ListView", + "DetailView", + "EmbeddedDetailView", + "CreateView", "UpdateView", "DeleteView", +] diff --git a/django_mongoengine/views/detail.py b/django_mongoengine/views/detail.py new file mode 100644 index 0000000..1f0f9cd --- /dev/null +++ b/django_mongoengine/views/detail.py @@ -0,0 +1,86 @@ +from django.core.exceptions import ImproperlyConfigured +from django.views.generic.base import View +from django.views.generic.base import TemplateResponseMixin +from django.views.generic import detail as djmod +from django.utils import six + +from django_mongoengine.utils.wrappers import ( + WrapDocument, copy_class, +) + +@six.add_metaclass(WrapDocument) +class SingleObjectMixin(djmod.SingleObjectMixin): + document = None + + def get_context_object_name(self, obj): + """ + Get the name to use for the object. + """ + if self.context_object_name: + return self.context_object_name + elif hasattr(obj, '_meta'): + return obj._meta.model_name + else: + return None + + + + +class SingleObjectTemplateResponseMixin(TemplateResponseMixin): + template_name_field = None + template_name_suffix = '_detail' + + def get_template_names(self): + """ + Return a list of template names to be used for the request. May not be + called if render_to_response is overridden. Returns the following list: + + * the value of ``template_name`` on the view (if provided) + * the contents of the ``template_name_field`` field on the + object instance that the view is operating upon (if available) + * ``/.html`` + """ + try: + names = super(SingleObjectTemplateResponseMixin, self).get_template_names() + except ImproperlyConfigured: + # If template_name isn't specified, it's not a problem -- + # we just start with an empty list. + names = [] + + # If self.template_name_field is set, grab the value of the field + # of that name from the object; this is the most specific template + # name, if given. + if self.object and self.template_name_field: + name = getattr(self.object, self.template_name_field, None) + if name: + names.insert(0, name) + + # The least-specific option is the default /_detail.html; + # only use this if the object in question is a model. + opts = None + if hasattr(self.object, '_meta'): + opts = self.object._meta + elif hasattr(self, 'model') and self.model is not None: + opts = self.model._meta + if opts: + names.append("%s/%s%s.html" % ( + opts.app_label, + opts.model_name, + self.template_name_suffix + )) + + # If we still haven't managed to find any template names, we should + # re-raise the ImproperlyConfigured to alert the user. + if not names: + raise + + return names + + +@copy_class(djmod.BaseDetailView) +class BaseDetailView(SingleObjectMixin, View): + __doc__ = djmod.BaseDetailView.__doc__ + + +class DetailView(SingleObjectTemplateResponseMixin, BaseDetailView): + pass diff --git a/django_mongoengine/views/edit.py b/django_mongoengine/views/edit.py new file mode 100644 index 0000000..5b90868 --- /dev/null +++ b/django_mongoengine/views/edit.py @@ -0,0 +1,68 @@ +from django.utils import six +from django.core.exceptions import ImproperlyConfigured + +from django_mongoengine.utils.wrappers import WrapDocument, copy_class +from django_mongoengine.utils.monkey import get_patched_django_module +from django_mongoengine.forms.documents import documentform_factory + +from .detail import SingleObjectMixin, SingleObjectTemplateResponseMixin + +djmod = get_patched_django_module( + "django.views.generic.edit", + model_forms=get_patched_django_module( + "django.forms.models", modelform_factory=documentform_factory, + ) +) + +try: + FormMixin = djmod.FormMixinBase +except AttributeError: + # django 1.10 + FormMixin = djmod.FormMixin + +class WrapDocumentForm(WrapDocument, FormMixin): + pass + + +class DocumentFormFixin(SingleObjectMixin): + + def get_success_url(self): + """ + Returns the supplied URL. + """ + if self.success_url: + url = self.success_url.format(**self.object._data) + else: + try: + url = self.object.get_absolute_url() + except AttributeError: + raise ImproperlyConfigured( + "No URL to redirect to. Either provide a url or define" + " a get_absolute_url method on the Model.") + return url + +@copy_class(djmod.CreateView) +class CreateView(six.with_metaclass( + WrapDocumentForm, + SingleObjectTemplateResponseMixin, + DocumentFormFixin, + djmod.BaseCreateView)): + __doc__ = djmod.CreateView.__doc__ + + +@copy_class(djmod.UpdateView) +class UpdateView(six.with_metaclass( + WrapDocumentForm, + SingleObjectTemplateResponseMixin, + DocumentFormFixin, + djmod.BaseUpdateView)): + __doc__ = djmod.UpdateView.__doc__ + + +@copy_class(djmod.DeleteView) +class DeleteView(six.with_metaclass( + WrapDocumentForm, + SingleObjectTemplateResponseMixin, + DocumentFormFixin, + djmod.BaseDeleteView)): + __doc__ = djmod.DeleteView.__doc__ diff --git a/django_mongoengine/views/embedded.py b/django_mongoengine/views/embedded.py new file mode 100644 index 0000000..231b368 --- /dev/null +++ b/django_mongoengine/views/embedded.py @@ -0,0 +1,115 @@ +from django.core.exceptions import ImproperlyConfigured +from django.utils import six + +from .detail import DetailView +from .edit import WrapDocumentForm, djmod + + +class EmbeddedFormMixin(djmod.FormMixin): + """ + A mixin that provides a way to show and handle a documentform in a request. + """ + embedded_form_class = None + embedded_context_name = 'embedded_form' + + def get_form_class(self): + """ + Returns the form class to use in this view + """ + if self.embedded_form_class: + return self.embedded_form_class + else: + raise ImproperlyConfigured( + "No embedded form class provided. An embedded form class must be provided.") + + def get_form(self, form_class=None): + """ + Returns an instance of the form to be used in this view. + """ + if form_class is None: + form_class = self.get_form_class() + return form_class(self.object, **self.get_form_kwargs()) + + def get_embedded_object(self): + """ + Returns an instance of the embedded object. By default this is a freshly created + instance. Override for something cooler. + """ + if hasattr(self, 'embedded_object'): + return self.embedded_object() + else: + klass = self.get_form_class() + return klass.Meta.document() + + def get_form_kwargs(self): + """ + Returns the keyword arguments for instantiating the form. + """ + kwargs = super(EmbeddedFormMixin, self).get_form_kwargs() + kwargs.update({'instance': self.get_embedded_object()}) + if not 'initial' in kwargs: + kwargs['initial'] = {} + return kwargs + + def get_success_url(self): + object = getattr(self, 'object', self.get_object()) + if self.success_url: + url = self.success_url % object.__dict__ + else: + try: + url = object.get_absolute_url() + except AttributeError: + raise ImproperlyConfigured( + "No URL to redirect to. Either provide a url or define" + " a get_absolute_url method on the document.") + return url + + def form_valid(self, form): + self.embedded_object = form.save() + return super(EmbeddedFormMixin, self).form_valid(form) + + def get_context_data(self, **kwargs): + context = super(EmbeddedFormMixin, self).get_context_data(**kwargs) + + self.object = getattr(self, 'object', self.get_object()) + if 'form' in kwargs: + form = kwargs['form'] + else: + form = self.get_form(self.get_form_class()) + context[self.embedded_context_name] = form + + return context + + +class ProcessEmbeddedFormMixin(object): + """ + A mixin that processes an embedded form on POST. + Does not implement any GET handling. + """ + def post(self, request, *args, **kwargs): + self.object = self.get_object() + form_class = self.get_form_class() + form = self.get_form(form_class) + if form.is_valid(): + return self.form_valid(form) + else: + return self.form_invalid(form) + super(ProcessEmbeddedFormMixin, self).post(request, *args, **kwargs) + + +class BaseEmbeddedFormMixin(EmbeddedFormMixin, ProcessEmbeddedFormMixin): + """ + A Mixin that handles an embedded form on POST and + adds the form into the template context. + """ + +class EmbeddedDetailView(six.with_metaclass( + WrapDocumentForm, + BaseEmbeddedFormMixin, DetailView)): + """ + Renders the detail view of a document and and adds a + form for an embedded object into the template. + + See BaseEmbeddedFormMixin for details on the form. + """ + diff --git a/django_mongoengine/views/list.py b/django_mongoengine/views/list.py new file mode 100644 index 0000000..fe02df4 --- /dev/null +++ b/django_mongoengine/views/list.py @@ -0,0 +1,27 @@ +from django.utils import six + +from mongoengine.queryset import QuerySet + +from django_mongoengine.utils.wrappers import WrapDocument, copy_class +from django_mongoengine.utils.monkey import get_patched_django_module + +__all__ = [ + "MultipleObjectMixin", + "ListView", +] + +djmod = get_patched_django_module("django.views.generic.list", + QuerySet=QuerySet, +) + +@six.add_metaclass(WrapDocument) +class MultipleObjectMixin(djmod.MultipleObjectMixin): + pass + +@six.add_metaclass(WrapDocument) +class MultipleObjectTemplateResponseMixin(djmod.MultipleObjectTemplateResponseMixin): + pass + +@copy_class(djmod.ListView) +class ListView(MultipleObjectTemplateResponseMixin, djmod.BaseListView): + __doc__ = djmod.ListView.__doc__ diff --git a/django_mongoengine/views/templates/_forms.html b/django_mongoengine/views/templates/_forms.html new file mode 100644 index 0000000..ed23d71 --- /dev/null +++ b/django_mongoengine/views/templates/_forms.html @@ -0,0 +1,21 @@ +
    +{% for field in form.visible_fields %} +
    + {{ field.label_tag }} +
    + {{ field }} + {% if field.errors or field.help_text %} + + {% if field.errors %} + {{ field.errors|join:' ' }} + {% else %} + {{ field.help_text }} + {% endif %} + + {% endif %} +
    +
    +{% endfor %} +{% csrf_token %} +
    {% for h in form.hidden_fields %} {{ h }}{% endfor %}
    +
    diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..8ed9c44 --- /dev/null +++ b/manage.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "primoprim.settings") + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/primoprim/__init__.py b/primoprim/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/primoprim/settings.py b/primoprim/settings.py new file mode 100644 index 0000000..1edc8f0 --- /dev/null +++ b/primoprim/settings.py @@ -0,0 +1,173 @@ +""" +Django settings for primoprim project. + +Generated by 'django-admin startproject' using Django 1.9.1. + +For more information on this file, see +https://docs.djangoproject.com/en/1.9/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.9/ref/settings/ +""" + +import os +import sys +import mongoengine + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) + +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'f1s4gad*)&glzg!bqv5^lt@36p&kuf+p_^36kv=x_$hov%y1)u' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = ['127.0.0.1', 'local.dev', 'localhost'] + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + + 'django_mongoengine', + 'django_mongoengine.mongo_auth', + 'django_mongoengine.mongo_admin', + 'django_mongoengine.mongo_admin.management', + + 'somnium.apps.SomniumConfig', +] + +MIDDLEWARE_CLASSES = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'primoprim.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [os.path.join(BASE_DIR, 'templates')], + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + 'loaders': [ + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + ], + }, + }, +] + +WSGI_APPLICATION = 'primoprim.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/1.9/ref/settings/#databases + +MONGODB_DATABASES = { + "default": { + "name": 'primoprim', + "host": '127.0.0.1:27017', + "password": '', + "username": '', + "tz_aware": True, # if you using timezones in django (USE_TZ = True) + }, +} + +DATABASES = { + 'default': { + # 'ENGINE': 'django.db.backends.dummy' + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + +# AUTHENTICATION_BACKENDS = ( +# 'mongoengine.django.auth.MongoEngineBackend', +# ) + +#SESSION_ENGINE = 'mongoengine.django.sessions' + +# Password validation +# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/1.9/topics/i18n/ + +LANGUAGE_CODE = 'fr' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.9/howto/static-files/ + +STATIC_URL = '/static/' + +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'filters': { + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse' + } + }, + 'handlers': { + 'mail_admins': { + 'level': 'ERROR', + 'filters': ['require_debug_false'], + 'class': 'django.utils.log.AdminEmailHandler' + } + }, + 'loggers': { + 'django.request': { + 'handlers': ['mail_admins'], + 'level': 'ERROR', + 'propagate': True, + }, + } +} diff --git a/primoprim/urls.py b/primoprim/urls.py new file mode 100644 index 0000000..16b0e2e --- /dev/null +++ b/primoprim/urls.py @@ -0,0 +1,22 @@ +"""primoprim URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/1.9/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.conf.urls import url, include + 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) +""" +from django.conf.urls import url, include +from django.contrib import admin + +urlpatterns = [ + url(r'^', include('somnium.urls')), + url(r'^admin/', admin.site.urls), +] diff --git a/primoprim/wsgi.py b/primoprim/wsgi.py new file mode 100644 index 0000000..6cc4f50 --- /dev/null +++ b/primoprim/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for primoprim project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/1.9/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "primoprim.settings") + +application = get_wsgi_application() diff --git a/somnium/__init__.py b/somnium/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/somnium/admin.py b/somnium/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/somnium/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/somnium/apps.py b/somnium/apps.py new file mode 100644 index 0000000..c75072d --- /dev/null +++ b/somnium/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class SomniumConfig(AppConfig): + name = 'somnium' diff --git a/somnium/migrations/__init__.py b/somnium/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/somnium/models.py b/somnium/models.py new file mode 100644 index 0000000..a5df0d1 --- /dev/null +++ b/somnium/models.py @@ -0,0 +1,13 @@ +from mongoengine import * +import datetime + +# Create your models here. +class Artist(Document): + name = StringField(max_length=50, required=True) + location = StringField(max_length=50) + +class Performance(Document): + title = StringField(max_length=50, required=True) + artists = ListField(ReferenceField(Artist)) + desc = StringField(max_length=500) + date = DateTimeField(help_text='schedule date', default=datetime.datetime(2017,7,14)) \ No newline at end of file diff --git a/somnium/static/somnium/images/background.jpg b/somnium/static/somnium/images/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..480ab68a49202de0abfc4257b86b8c94d7b6c4cf GIT binary patch literal 359047 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%0DL#iGr`Gmyn;p)UC?a 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 z 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

    A?BSL=#+&99yJ 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

    B~eLz>1J5G1PZ}7O~_0~%}t^= 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 WzNf^bIzq-NyO&0@IM>u%&;Qvgv|5w^ literal 0 HcmV?d00001 diff --git a/somnium/static/somnium/style.css b/somnium/static/somnium/style.css new file mode 100644 index 0000000..15053c5 --- /dev/null +++ b/somnium/static/somnium/style.css @@ -0,0 +1,9 @@ +body { + font-family: monospace; + background: #e2cecf url("images/background.jpg") no-repeat 50% 0; + background-size: contain; +} + +li a { + color: #455865; +} \ No newline at end of file diff --git a/somnium/templates/admin/base_site.html b/somnium/templates/admin/base_site.html new file mode 100644 index 0000000..82399a2 --- /dev/null +++ b/somnium/templates/admin/base_site.html @@ -0,0 +1,9 @@ +{% extends "admin/base.html" %} + +{% block title %}{{ title }} | {{ site_title|default:_('PrimoPrim') }}{% endblock %} + +{% block branding %} + +{% endblock %} + +{% block nav-global %}{% endblock %} \ No newline at end of file diff --git a/somnium/templates/somnium/index.html b/somnium/templates/somnium/index.html new file mode 100644 index 0000000..5eec6ff --- /dev/null +++ b/somnium/templates/somnium/index.html @@ -0,0 +1,9 @@ +{% load static %} + + + + \ No newline at end of file diff --git a/somnium/tests.py b/somnium/tests.py new file mode 100644 index 0000000..589f267 --- /dev/null +++ b/somnium/tests.py @@ -0,0 +1,17 @@ +from django.test.simple import DjangoTestSuiteRunner +from django.test import TestCase + +# Create your tests here. + + +class NoSQLTestRunner(DjangoTestSuiteRunner): + def setup_databases(self): + pass + def teardown_databases(self, *args): + pass + +class NoSQLTestCase(TestCase): + def _fixture_setup(self): + pass + def _fixture_teardown(self): + pass \ No newline at end of file diff --git a/somnium/urls.py b/somnium/urls.py new file mode 100644 index 0000000..da31912 --- /dev/null +++ b/somnium/urls.py @@ -0,0 +1,8 @@ +from django.conf.urls import url + +from . import views + +app_name = 'somnium' +urlpatterns = [ + url(r'^$', views.IndexView.as_view(), name='index'), +] \ No newline at end of file diff --git a/somnium/views.py b/somnium/views.py new file mode 100644 index 0000000..5df42bc --- /dev/null +++ b/somnium/views.py @@ -0,0 +1,12 @@ +from mongoengine import * +from django.views import generic + +from .models import Artist, Performance + +# Create your views here. +class IndexView(generic.ListView): + template_name = 'somnium/index.html' + context_object_name = 'artists_list' + + def get_queryset(self): + return Artist.objects.order_by('name')

    PrimoPrim Admin