From: Emilie Date: Wed, 17 Aug 2016 17:34:13 +0000 (+0200) Subject: Autocomplete Light + Uninstalled Orderable X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=35392aef2f5204f1f7e3346313c6c89c03b9f416;p=mezzo.git Autocomplete Light + Uninstalled Orderable --- diff --git a/app/organization/magazine/admin.py b/app/organization/magazine/admin.py index 2693a735..b1dd7562 100644 --- a/app/organization/magazine/admin.py +++ b/app/organization/magazine/admin.py @@ -3,8 +3,8 @@ from django import forms from copy import deepcopy from mezzanine.core.admin import * from mezzanine.pages.admin import PageAdmin -from orderable.admin import OrderableAdmin, OrderableTabularInline -from organization.magazine.models import Article, Brief, Topic, ArticleImage +#from orderable.admin import OrderableTabularInline #OrderableAdmin, +from organization.magazine.models import Article, Brief, Topic, ArticleImage, BriefForm class ArticleImageInline(TabularDynamicInlineAdmin): @@ -25,16 +25,20 @@ class ArticleAdminDisplayable(DisplayableAdmin): inlines = [ArticleImageInline,] -class BriefAdmin(OrderableTabularInline): +class BriefAdmin(admin.ModelAdmin): #OrderableTabularInline model = Brief -class BriefAdminDisplayable(BaseTranslationModelAdmin, OrderableAdmin): +class BriefAdminDisplayable(BaseTranslationModelAdmin,): #, OrderableAdmin - list_display = ('title', 'local_content', 'sort_order_display',) + #list_display = ('title', 'local_content', 'sort_order_display',) + form = BriefForm fieldsets = deepcopy(BriefAdmin.fieldsets) + # form = BriefForm + # form = autocomplete_light.modelform_factory(Brief) + admin.site.register(Article, ArticleAdminDisplayable) admin.site.register(Brief, BriefAdminDisplayable) diff --git a/app/organization/magazine/migrations/0012_auto_20160812_1738.py b/app/organization/magazine/migrations/0012_auto_20160812_1738.py new file mode 100644 index 00000000..047fdec1 --- /dev/null +++ b/app/organization/magazine/migrations/0012_auto_20160812_1738.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-12 15:38 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('organization-magazine', '0011_articleimage'), + ] + + operations = [ + migrations.CreateModel( + name='TestModel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('object_id', models.PositiveIntegerField(blank=True, editable=False, null=True)), + ('content_type', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ], + ), + migrations.AddField( + model_name='brief', + name='content_type', + field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='brief', + name='object_id', + field=models.PositiveIntegerField(blank=True, editable=False, null=True), + ), + ] diff --git a/app/organization/magazine/migrations/0013_auto_20160812_1813.py b/app/organization/magazine/migrations/0013_auto_20160812_1813.py new file mode 100644 index 00000000..7bcdb9e6 --- /dev/null +++ b/app/organization/magazine/migrations/0013_auto_20160812_1813.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-12 16:13 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-magazine', '0012_auto_20160812_1738'), + ] + + operations = [ + migrations.RemoveField( + model_name='testmodel', + name='content_type', + ), + migrations.AlterField( + model_name='brief', + name='content_type', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType', verbose_name='content page'), + ), + migrations.AlterField( + model_name='brief', + name='object_id', + field=models.PositiveIntegerField(null=True, verbose_name='related object'), + ), + migrations.DeleteModel( + name='TestModel', + ), + ] diff --git a/app/organization/magazine/models.py b/app/organization/magazine/models.py index f53d79ec..aa388d00 100644 --- a/app/organization/magazine/models.py +++ b/app/organization/magazine/models.py @@ -1,16 +1,23 @@ from __future__ import unicode_literals from django.db import models +from django import forms +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType from django.utils.translation import ugettext_lazy as _ from django.core.urlresolvers import reverse, reverse_lazy +from dal import autocomplete from mezzanine.core.models import RichText, Displayable, Slugged from mezzanine.pages.models import Page from mezzanine.blog.models import BlogPost -from orderable.models import Orderable +#from orderable.models import Orderable +# from autocomplete.dal_queryset_sequence.fields import ( +# QuerySetSequenceModelField, +# QuerySetSequenceModelMultipleField, +# ) from organization.core.models import Named, Description, Image from organization.media.models import Photo - class ArticleImage(Image): article_fk = models.ForeignKey("Article", verbose_name=_('article')) @@ -34,17 +41,68 @@ class Article(BlogPost, Photo): verbose_name = _('article') -class Brief(Displayable, RichText, Orderable): +class Brief(Displayable, RichText): #Orderable text_button = models.CharField(blank=True, max_length=150, null=False, verbose_name='text button') local_content = models.URLField(blank=False, max_length=1000, null=False, verbose_name='local content') + limit = models.Q(app_label='organization-magazine', model='article') | \ + models.Q(app_label='organization-magazine', model='topic') + content_type = models.ForeignKey( + ContentType, + verbose_name=_('content page'), + limit_choices_to=limit, + null=True, + blank=True, + ) + object_id = models.PositiveIntegerField( + verbose_name=_('related object'), + null=True, + ) + content_object = GenericForeignKey('content_type', 'object_id') + + def get_absolute_url(self): return self.local_content class Meta: verbose_name = _('brief') - ordering = ['sort_order'] + #ordering = ['sort_order'] + + + +# class BriefForm(forms.ModelForm): +# +# selected_object = forms.ModelChoiceField( +# queryset=ContentType.objects.all(), +# widget=autocomplete.ModelSelect2(url='object-autocomplete') +# ) +# +# class Meta: +# model = Brief +# fields = ('__all__') + +class BriefForm(autocomplete.FutureModelForm): + + selected_object = forms.ModelChoiceField( + queryset=ContentType.objects.all(), + widget=autocomplete.ModelSelect2(url='object-autocomplete') + ) + + # content_object = autocomplete.QuerySetSequenceModelField( + # queryset=autocomplete.QuerySetSequence( + # #Article.objects.all(), + # #Topic.objects.all(), + # #ContentType.objects.all(), + # ), + # required=False, + # widget=autocomplete.QuerySetSequenceSelect2('object-autocomplete'), + # ) + + class Meta: + model = Brief + fields = ('__all__') + class Topic(Page, RichText): """Topic for magazine menu""" diff --git a/app/organization/magazine/urls.py b/app/organization/magazine/urls.py index 951be16a..effc824c 100644 --- a/app/organization/magazine/urls.py +++ b/app/organization/magazine/urls.py @@ -15,4 +15,9 @@ urlpatterns = [ url("^article/$", ArticleListView.as_view(), name="magazine-article-list"), url("^article/detail/(?P.*)%s$" % _slash, ArticleDetailView.as_view(), name="magazine-article-detail"), url("^topic/detail/(?P.*)%s$" % _slash, TopicDetailView.as_view(), name='topic-detail'), + url( + r'^object-autocomplete/$', + ObjectAutocomplete.as_view(), + name='object-autocomplete', + ), ] diff --git a/app/organization/magazine/views.py b/app/organization/magazine/views.py index a039256c..cfb0326e 100644 --- a/app/organization/magazine/views.py +++ b/app/organization/magazine/views.py @@ -3,8 +3,11 @@ from django.shortcuts import render from django.utils import timezone #from django.views.generic import * from django.views.generic import DetailView, ListView, TemplateView +from django.contrib.contenttypes.models import ContentType from django.views.generic.base import * from django.shortcuts import get_object_or_404 +from itertools import chain +from dal import autocomplete from organization.magazine.models import Article, Topic, Brief from organization.team.models import Department @@ -79,3 +82,29 @@ class TopicDetailView(SlugMixin, DetailView): def get_context_data(self, **kwargs): context = super(TopicDetailView, self).get_context_data(**kwargs) return context + +class ObjectAutocomplete(autocomplete.Select2QuerySetView): + def get_queryset(self): + + #qs = chain(Topic.objects.all(), Article.objects.all()) + #qs = Article.objects.all() + articles = Article.objects.all() + topics = Topic.objects.all() + + + if self.q: + #qs = qs.filter(name__istartswith=self.q) + articles = articles.filter(name__icontains=self.q) + topics = topics.filter(name__icontains=self.q) + + qs = QuerySetSequence(articles, topics) + + if self.q: + # This would apply the filter on all the querysets + qs = qs.filter(name__icontains=self.q) + + # This will limit each queryset so that they show an equal number + # of results. + qs = self.mixup_querysets(qs) + print(qs) + return qs diff --git a/app/scripts/app.sh b/app/scripts/app.sh index 7bdf3e50..3a9d01ba 100644 --- a/app/scripts/app.sh +++ b/app/scripts/app.sh @@ -21,6 +21,7 @@ patterns='*.js;*.css;*.jpg;*.jpeg;*.gif;*.png;*.svg;*.ttf;*.eot;*.woff;*.woff2' # pip install psycopg2 # pip install -U https://forge.ircam.fr/p/django-eve/source/download/dev/ # pip install -U https://github.com/stephenmcd/grappelli-safe/archive/dynamic_stacked.zip +# pip install django-querysetsequence chown -R $uid:$gid $media diff --git a/app/settings.py b/app/settings.py index a7062cfc..f0e6d782 100644 --- a/app/settings.py +++ b/app/settings.py @@ -199,6 +199,9 @@ ROOT_URLCONF = "urls" INSTALLED_APPS = [ "modeltranslation", + "dal", + "dal_select2", + "dal_queryset_sequence", "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", @@ -222,7 +225,7 @@ INSTALLED_APPS = [ 'djangobower', "meta", "mezzanine_agenda", - "orderable", +# "orderable", "organization.core", "organization.team", "organization.festival", diff --git a/app/templates/admin/base_site.html b/app/templates/admin/base_site.html index eb23ab24..e601e21e 100644 --- a/app/templates/admin/base_site.html +++ b/app/templates/admin/base_site.html @@ -30,7 +30,6 @@ window.__admin_menu_collapsed = {{ settings.ADMIN_MENU_COLLAPSED|lower }}; window.__language_code = '{{ LANGUAGE_CODE }}'; - {% if not settings.GRAPPELLI_INSTALLED %} {% endif %} diff --git a/app/templates/core/admin/base_site.html b/app/templates/core/admin/base_site.html new file mode 100644 index 00000000..cc5649e5 --- /dev/null +++ b/app/templates/core/admin/base_site.html @@ -0,0 +1,77 @@ +{% extends "admin/base.html" %} +{% load mezzanine_tags i18n staticfiles %} + +{% block title %}{{ title }} | Mezzanine{% endblock %} + +{% block extrahead %} + + + + +{% if not settings.GRAPPELLI_INSTALLED %} + +{% endif %} + + + +{% endblock %} + +{% block rtl_styles %} +{{ block.super }} + +{% endblock %} + +{% block before_content %} +{% if user.is_staff and not is_popup and not request.GET.pop %} +{% admin_dropdown_menu %} +{% endif %} +{% endblock %} + +{% block footer %} +{% if form.this_is_the_login_form %} + +{% else %} + {% if user.is_staff %} + {% if not is_popup and not request.GET.pop %} + + + + + {% endif %} + + {% if settings.GRAPPELLI_INSTALLED %} + + {% endif %} + {% endif %} +{% endif %} +{% endblock %} diff --git a/app/templates/includes/footer_scripts.html b/app/templates/includes/footer_scripts.html index fe192a9e..7cfda83e 100644 --- a/app/templates/includes/footer_scripts.html +++ b/app/templates/includes/footer_scripts.html @@ -1,7 +1,7 @@ {% load mezzanine_tags i18n staticfiles %} {% compress js %} - + diff --git a/requirements-dev.txt b/requirements-dev.txt index a2f808ed..ace5a184 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,4 +1,5 @@ -e git+https://github.com/yomguy/mezzanine-agenda.git#egg=mezzanine-agenda-0.2.2 -e git+https://github.com/stephenmcd/mezzanine.git@master#egg=mezzanine-4.1-master -e git+https://github.com/stephenmcd/grappelli-safe.git@dynamic_stacked#egg=grappelli-safe-0.4.2 +-e git+https://github.com/yourlabs/django-autocomplete-light.git#egg=django-autocomplete-light #https://forge.ircam.fr/p/django-eve/source/download/dev/ diff --git a/requirements.txt b/requirements.txt index 719302e3..080247cd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,4 +12,3 @@ django-bower django-debug-toolbar django-extensions django-countries -django-orderable