From: Emilie Date: Thu, 18 Aug 2016 10:43:47 +0000 (+0200) Subject: Brief: add autocomplete fields on Events, Articles and BasicPage for local links X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=641f0d0e6840f4679201a811ab10b6e3f871d809;p=mezzo.git Brief: add autocomplete fields on Events, Articles and BasicPage for local links --- diff --git a/app/organization/magazine/admin.py b/app/organization/magazine/admin.py index fe2d6a7d..553b249a 100644 --- a/app/organization/magazine/admin.py +++ b/app/organization/magazine/admin.py @@ -33,12 +33,10 @@ class BriefAdmin(admin.ModelAdmin): #OrderableTabularInline class BriefAdminDisplayable(BaseTranslationModelAdmin,): #, OrderableAdmin - #list_display = ('title', 'local_content', 'sort_order_display',) + list_display = ('title', 'external_content', 'content_object', ) form = BriefForm fieldsets = deepcopy(BriefAdmin.fieldsets) - # form = BriefForm - # form = autocomplete_light.modelform_factory(Brief) admin.site.register(Article, ArticleAdminDisplayable) diff --git a/app/organization/magazine/forms.py b/app/organization/magazine/forms.py index 4388d2b3..b47fb511 100644 --- a/app/organization/magazine/forms.py +++ b/app/organization/magazine/forms.py @@ -4,7 +4,8 @@ import dal_queryset_sequence import dal_select2_queryset_sequence from organization.magazine.models import Article, Topic, Brief - +from organization.core.models import BasicPage +from mezzanine_agenda.models import Event class BriefForm(autocomplete.FutureModelForm): @@ -16,7 +17,8 @@ class BriefForm(autocomplete.FutureModelForm): content_object = dal_queryset_sequence.fields.QuerySetSequenceModelField( queryset=autocomplete.QuerySetSequence( Article.objects.all(), - Topic.objects.all(), + Event.objects.all(), + BasicPage.objects.all(), # ContentType.objects.all(), ), required=False, diff --git a/app/organization/magazine/migrations/0014_auto_20160818_1124.py b/app/organization/magazine/migrations/0014_auto_20160818_1124.py new file mode 100644 index 00000000..0a5f45e6 --- /dev/null +++ b/app/organization/magazine/migrations/0014_auto_20160818_1124.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-18 09:24 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-magazine', '0013_auto_20160812_1813'), + ] + + operations = [ + migrations.AlterModelOptions( + name='brief', + options={'verbose_name': 'brief'}, + ), + migrations.RemoveField( + model_name='brief', + name='sort_order', + ), + ] diff --git a/app/organization/magazine/migrations/0015_auto_20160818_1131.py b/app/organization/magazine/migrations/0015_auto_20160818_1131.py new file mode 100644 index 00000000..45407e05 --- /dev/null +++ b/app/organization/magazine/migrations/0015_auto_20160818_1131.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-18 09:31 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-magazine', '0014_auto_20160818_1124'), + ] + + operations = [ + migrations.AlterField( + 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', verbose_name='content page'), + ), + migrations.AlterField( + model_name='brief', + name='object_id', + field=models.PositiveIntegerField(editable=False, null=True, verbose_name='related object'), + ), + ] diff --git a/app/organization/magazine/migrations/0016_auto_20160818_1230.py b/app/organization/magazine/migrations/0016_auto_20160818_1230.py new file mode 100644 index 00000000..58951655 --- /dev/null +++ b/app/organization/magazine/migrations/0016_auto_20160818_1230.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-18 10:30 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-magazine', '0015_auto_20160818_1131'), + ] + + operations = [ + migrations.RemoveField( + model_name='brief', + name='local_content', + ), + migrations.RemoveField( + model_name='brief', + name='local_content_en', + ), + migrations.RemoveField( + model_name='brief', + name='local_content_fr', + ), + ] diff --git a/app/organization/magazine/migrations/0017_brief_external_content.py b/app/organization/magazine/migrations/0017_brief_external_content.py new file mode 100644 index 00000000..8cfd4363 --- /dev/null +++ b/app/organization/magazine/migrations/0017_brief_external_content.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-18 10:31 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-magazine', '0016_auto_20160818_1230'), + ] + + operations = [ + migrations.AddField( + model_name='brief', + name='external_content', + field=models.URLField(default=1, max_length=1000, verbose_name='external content'), + preserve_default=False, + ), + ] diff --git a/app/organization/magazine/migrations/0018_auto_20160818_1232.py b/app/organization/magazine/migrations/0018_auto_20160818_1232.py new file mode 100644 index 00000000..759203f7 --- /dev/null +++ b/app/organization/magazine/migrations/0018_auto_20160818_1232.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-18 10:32 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-magazine', '0017_brief_external_content'), + ] + + operations = [ + migrations.AddField( + model_name='brief', + name='external_content_en', + field=models.URLField(max_length=1000, null=True, verbose_name='external content'), + ), + migrations.AddField( + model_name='brief', + name='external_content_fr', + field=models.URLField(max_length=1000, null=True, verbose_name='external content'), + ), + ] diff --git a/app/organization/magazine/migrations/0019_auto_20160818_1233.py b/app/organization/magazine/migrations/0019_auto_20160818_1233.py new file mode 100644 index 00000000..eaef703c --- /dev/null +++ b/app/organization/magazine/migrations/0019_auto_20160818_1233.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-18 10:33 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-magazine', '0018_auto_20160818_1232'), + ] + + operations = [ + migrations.AlterField( + model_name='brief', + name='external_content', + field=models.URLField(max_length=1000, null=True, verbose_name='external content'), + ), + ] diff --git a/app/organization/magazine/migrations/0020_auto_20160818_1238.py b/app/organization/magazine/migrations/0020_auto_20160818_1238.py new file mode 100644 index 00000000..b2a1b576 --- /dev/null +++ b/app/organization/magazine/migrations/0020_auto_20160818_1238.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-18 10:38 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-magazine', '0019_auto_20160818_1233'), + ] + + operations = [ + migrations.AlterField( + model_name='brief', + name='external_content', + field=models.URLField(blank=True, max_length=1000, verbose_name='external content'), + ), + migrations.AlterField( + model_name='brief', + name='external_content_en', + field=models.URLField(blank=True, max_length=1000, null=True, verbose_name='external content'), + ), + migrations.AlterField( + model_name='brief', + name='external_content_fr', + field=models.URLField(blank=True, max_length=1000, null=True, verbose_name='external content'), + ), + ] diff --git a/app/organization/magazine/models.py b/app/organization/magazine/models.py index 8bcc1314..fe607bd4 100644 --- a/app/organization/magazine/models.py +++ b/app/organization/magazine/models.py @@ -11,10 +11,6 @@ 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 autocomplete.dal_queryset_sequence.fields import ( -# QuerySetSequenceModelField, -# QuerySetSequenceModelMultipleField, -# ) from organization.core.models import Named, Description, Image from organization.media.models import Photo @@ -44,45 +40,34 @@ class Article(BlogPost, Photo): 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') + external_content = models.URLField(blank=True, max_length=1000, null=False, verbose_name='external content') - limit = models.Q(app_label='organization-magazine', model='article') | \ - models.Q(app_label='organization-magazine', model='topic') + # used for autocomplete but hidden in admin content_type = models.ForeignKey( ContentType, verbose_name=_('content page'), - limit_choices_to=limit, null=True, blank=True, + editable=False, ) + + # used for autocomplete but hidden in admin object_id = models.PositiveIntegerField( verbose_name=_('related object'), null=True, + editable=False, ) - content_object = GenericForeignKey('content_type', 'object_id') + content_object = GenericForeignKey('content_type', 'object_id') def get_absolute_url(self): - return self.local_content + return self.external_content class Meta: verbose_name = _('brief') #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 Topic(Page, RichText): """Topic for magazine menu""" diff --git a/app/organization/magazine/translation.py b/app/organization/magazine/translation.py index d2351c77..063dc59e 100644 --- a/app/organization/magazine/translation.py +++ b/app/organization/magazine/translation.py @@ -15,7 +15,7 @@ class ArticleTranslationOptions(TranslationOptions): @register(Brief) class BriefTranslationOptions(TranslationOptions): - fields = ('text_button', 'local_content') + fields = ('text_button', 'external_content', ) @register(Topic) class TopicTranslationOptions(TranslationOptions): diff --git a/app/organization/magazine/views.py b/app/organization/magazine/views.py index 945d4f64..be89739c 100644 --- a/app/organization/magazine/views.py +++ b/app/organization/magazine/views.py @@ -8,15 +8,14 @@ from django.views.generic.base import * from django.shortcuts import get_object_or_404 from itertools import chain from dal import autocomplete - +from dal_select2_queryset_sequence.views import Select2QuerySetSequenceView +from mezzanine_agenda.models import Event from organization.magazine.models import Article, Topic, Brief from organization.team.models import Department - +from organization.core.models import BasicPage from organization.core.views import SlugMixin from django.template.defaultfilters import slugify -from dal import autocomplete -from dal_select2_queryset_sequence.views import Select2QuerySetSequenceView class ArticleDetailView(SlugMixin, DetailView): @@ -89,17 +88,16 @@ class TopicDetailView(SlugMixin, DetailView): class ObjectAutocomplete(Select2QuerySetSequenceView): def get_queryset(self): - #qs = chain(Topic.objects.all(), Article.objects.all()) - #qs = Article.objects.all() articles = Article.objects.all() - topics = Topic.objects.all() + basicpage = BasicPage.objects.all() + events = Event.objects.all() if self.q: - #qs = qs.filter(name__istartswith=self.q) articles = articles.filter(title__icontains=self.q) - topics = topics.filter(title__icontains=self.q) + basicpage = basicpage.filter(title__icontains=self.q) + events = events.filter(title__icontains=self.q) - qs = autocomplete.QuerySetSequence(articles, topics) + qs = autocomplete.QuerySetSequence(articles, basicpage, events ) if self.q: # This would apply the filter on all the querysets @@ -108,5 +106,5 @@ class ObjectAutocomplete(Select2QuerySetSequenceView): # 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/organization/project/migrations/0005_auto_20160818_1118.py b/app/organization/project/migrations/0005_auto_20160818_1118.py new file mode 100644 index 00000000..6f44e014 --- /dev/null +++ b/app/organization/project/migrations/0005_auto_20160818_1118.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-18 09:18 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-team', '0016_auto_20160812_1521'), + ('organization-project', '0004_auto_20160809_1413'), + ] + + operations = [ + migrations.RemoveField( + model_name='project', + name='leader_team', + ), + migrations.RemoveField( + model_name='project', + name='partner_organizations', + ), + migrations.RemoveField( + model_name='project', + name='partner_persons', + ), + migrations.RemoveField( + model_name='project', + name='partner_teams', + ), + migrations.AddField( + model_name='project', + name='lead_team', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='leader_projects', to='organization-team.Team', verbose_name='lead team'), + ), + migrations.AddField( + model_name='project', + name='organizations', + field=models.ManyToManyField(blank=True, to='organization-team.Organization', verbose_name='organizations'), + ), + migrations.AddField( + model_name='project', + name='persons', + field=models.ManyToManyField(blank=True, to='organization-team.Person', verbose_name='persons'), + ), + migrations.AddField( + model_name='project', + name='teams', + field=models.ManyToManyField(blank=True, related_name='patner_projects', to='organization-team.Team', verbose_name='teams'), + ), + ] diff --git a/app/scripts/app.sh b/app/scripts/app.sh index 96d6ad6f..4abdaee0 100644 --- a/app/scripts/app.sh +++ b/app/scripts/app.sh @@ -22,8 +22,8 @@ patterns='*.js;*.css;*.jpg;*.jpeg;*.gif;*.png;*.svg;*.ttf;*.eot;*.woff;*.woff2' # 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 -pip install django-autocomplete-light django-querysetsequence -/usr/bin/yes | pip uninstall django-orderable +#pip install django-autocomplete-light django-querysetsequence +#/usr/bin/yes | pip uninstall django-orderable chown -R $uid:$gid $media diff --git a/app/templates/magazine/brief/brief_detail.html b/app/templates/magazine/brief/brief_detail.html index 3d5d3b18..6a9089b9 100644 --- a/app/templates/magazine/brief/brief_detail.html +++ b/app/templates/magazine/brief/brief_detail.html @@ -1,7 +1,7 @@ {% load i18n pages_tags mezzanine_tags %}
diff --git a/app/templates/magazine/brief/brief_list.html b/app/templates/magazine/brief/brief_list.html index a0f3b45a..e1221e20 100644 --- a/app/templates/magazine/brief/brief_list.html +++ b/app/templates/magazine/brief/brief_list.html @@ -1,5 +1,5 @@ {% for brief in briefs %}

{{ brief.title }}

{{ brief.description|truncatechars:100 }}

- {{ brief.text_button }} + {{ brief.text_button }} {% endfor %} diff --git a/requirements.txt b/requirements.txt index bff21316..5d46cf12 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,3 +12,5 @@ django-bower django-debug-toolbar django-extensions django-countries +django-querysetsequence +django-autocomplete-light