From 0a0e26cdfb1abd6aba9b475b42f44567f06558fe Mon Sep 17 00:00:00 2001 From: Emilie Date: Fri, 16 Sep 2016 18:29:07 +0200 Subject: [PATCH] Person Block : Simple autocomplete on one FK instead on GFK --- app/organization/network/admin.py | 16 ++---- app/organization/network/forms.py | 51 ++++++++----------- .../migrations/0009_personlistblock_page.py | 22 ++++++++ .../migrations/0010_personautocomplete.py | 26 ++++++++++ .../0011_personautocomplete_persons.py | 20 ++++++++ .../migrations/0012_auto_20160916_1456.py | 20 ++++++++ .../migrations/0013_auto_20160916_1715.py | 24 +++++++++ .../migrations/0014_auto_20160916_1719.py | 26 ++++++++++ .../migrations/0015_auto_20160916_1732.py | 26 ++++++++++ .../migrations/0016_auto_20160916_1741.py | 21 ++++++++ .../0017_personlistblock_person_list_block.py | 22 ++++++++ .../migrations/0018_auto_20160916_1813.py | 29 +++++++++++ app/organization/network/models.py | 11 ++++ app/organization/network/translation.py | 6 +++ app/organization/network/urls.py | 5 +- app/organization/network/views.py | 40 ++++++++++----- app/organization/pages/admin.py | 24 ++++----- 17 files changed, 314 insertions(+), 75 deletions(-) create mode 100644 app/organization/network/migrations/0009_personlistblock_page.py create mode 100644 app/organization/network/migrations/0010_personautocomplete.py create mode 100644 app/organization/network/migrations/0011_personautocomplete_persons.py create mode 100644 app/organization/network/migrations/0012_auto_20160916_1456.py create mode 100644 app/organization/network/migrations/0013_auto_20160916_1715.py create mode 100644 app/organization/network/migrations/0014_auto_20160916_1719.py create mode 100644 app/organization/network/migrations/0015_auto_20160916_1732.py create mode 100644 app/organization/network/migrations/0016_auto_20160916_1741.py create mode 100644 app/organization/network/migrations/0017_personlistblock_person_list_block.py create mode 100644 app/organization/network/migrations/0018_auto_20160916_1813.py diff --git a/app/organization/network/admin.py b/app/organization/network/admin.py index 78ee16dd..1edef961 100644 --- a/app/organization/network/admin.py +++ b/app/organization/network/admin.py @@ -117,23 +117,15 @@ class PersonAdmin(BaseTranslationModelAdmin): return res -class DynamicContentPersonListInline(TabularDynamicInlineAdmin): +class PersonAutocompleteInline(TabularDynamicInlineAdmin): - model = DynamicPersonList - form = DynamicPersonListForm - - class Media: - js = ( - static("mezzanine/js/admin/dynamic_inline.js"), - static("mezzanine/js/jquery-ui-1.9.2.min.js"), - ) + model = PersonAutocomplete + form = PersonAutocompleteForm class PersonListBlockAdmin(admin.ModelAdmin): - inlines = [DynamicContentPersonListInline, ] - - + inlines = [PersonAutocompleteInline,] admin.site.register(Organization, OrganizationAdmin) diff --git a/app/organization/network/forms.py b/app/organization/network/forms.py index ce6461e1..2872e579 100644 --- a/app/organization/network/forms.py +++ b/app/organization/network/forms.py @@ -5,40 +5,29 @@ from django import forms from django.forms.widgets import HiddenInput from django.forms import ModelForm from mezzanine.core.models import Orderable -from organization.network.models import Person -from organization.network.models import PersonListBlock, DynamicPersonList #DynamicContentPersonList, -from organization.pages.models import DynamicPersonListBlockPage - - -class DynamicPersonListForm(autocomplete.FutureModelForm): - """ - List of Person - """ - content_object = dal_queryset_sequence.fields.QuerySetSequenceModelField( - queryset=autocomplete.QuerySetSequence( - Person.objects.all(), - ), - required=False, - widget=dal_select2_queryset_sequence.widgets.QuerySetSequenceSelect2('dynamic-person-list'), +from organization.network.models import Person, PersonListBlock, DynamicPersonList, PersonAutocomplete #DynamicContentPersonList, +from organization.pages.models import DynamicPersonListBlockPage, Page + + +class PagePersonListForm(forms.ModelForm): + + person_list_block = forms.ModelChoiceField( + queryset=PersonListBlock.objects.all(), + widget=autocomplete.ModelSelect2(url='person-list-block-autocomplete') ) class Meta: - model = DynamicPersonList - fields = ('content_object',) - - -class DynamicContentPersonListBlockForm(autocomplete.FutureModelForm): - """ - List of PersonListBlock - """ - content_object = dal_queryset_sequence.fields.QuerySetSequenceModelField( - queryset=autocomplete.QuerySetSequence( - PersonListBlock.objects.all(), - ), - required=False, - widget=dal_select2_queryset_sequence.widgets.QuerySetSequenceSelect2('dynamic-content-person-list-block'), + model = Page + fields = ('person_list_block',) + + +class PersonAutocompleteForm(forms.ModelForm): + + person = forms.ModelChoiceField( + queryset=Person.objects.all(), + widget=autocomplete.ModelSelect2(url='person-autocomplete') ) class Meta: - model = DynamicPersonListBlockPage - fields = ('content_object',) + model = PersonAutocomplete + fields = ('__all__') diff --git a/app/organization/network/migrations/0009_personlistblock_page.py b/app/organization/network/migrations/0009_personlistblock_page.py new file mode 100644 index 00000000..341e817a --- /dev/null +++ b/app/organization/network/migrations/0009_personlistblock_page.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-16 11:06 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('pages', '0004_auto_20160804_1547'), + ('organization-network', '0008_auto_20160916_1129'), + ] + + operations = [ + migrations.AddField( + model_name='personlistblock', + name='page', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='person_list_block', to='pages.Page', verbose_name='Page'), + ), + ] diff --git a/app/organization/network/migrations/0010_personautocomplete.py b/app/organization/network/migrations/0010_personautocomplete.py new file mode 100644 index 00000000..940cdf10 --- /dev/null +++ b/app/organization/network/migrations/0010_personautocomplete.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-16 12:40 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-network', '0009_personlistblock_page'), + ] + + operations = [ + migrations.CreateModel( + name='PersonAutocomplete', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('person_list_block', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='person_autocomplete', to='organization-network.PersonListBlock', verbose_name='Person List Block')), + ], + options={ + 'verbose_name': 'Person autocomplete', + }, + ), + ] diff --git a/app/organization/network/migrations/0011_personautocomplete_persons.py b/app/organization/network/migrations/0011_personautocomplete_persons.py new file mode 100644 index 00000000..5e5955ba --- /dev/null +++ b/app/organization/network/migrations/0011_personautocomplete_persons.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-16 12:46 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-network', '0010_personautocomplete'), + ] + + operations = [ + migrations.AddField( + model_name='personautocomplete', + name='persons', + field=models.ManyToManyField(to='organization-network.Person'), + ), + ] diff --git a/app/organization/network/migrations/0012_auto_20160916_1456.py b/app/organization/network/migrations/0012_auto_20160916_1456.py new file mode 100644 index 00000000..eb675f9e --- /dev/null +++ b/app/organization/network/migrations/0012_auto_20160916_1456.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-16 12:56 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-network', '0011_personautocomplete_persons'), + ] + + operations = [ + migrations.RenameField( + model_name='personautocomplete', + old_name='persons', + new_name='person', + ), + ] diff --git a/app/organization/network/migrations/0013_auto_20160916_1715.py b/app/organization/network/migrations/0013_auto_20160916_1715.py new file mode 100644 index 00000000..8ee57f65 --- /dev/null +++ b/app/organization/network/migrations/0013_auto_20160916_1715.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-16 15:15 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-network', '0012_auto_20160916_1456'), + ] + + operations = [ + migrations.RemoveField( + model_name='personautocomplete', + name='person', + ), + migrations.AddField( + model_name='personlistblock', + name='persons', + field=models.ManyToManyField(to='organization-network.Person'), + ), + ] diff --git a/app/organization/network/migrations/0014_auto_20160916_1719.py b/app/organization/network/migrations/0014_auto_20160916_1719.py new file mode 100644 index 00000000..1857ef06 --- /dev/null +++ b/app/organization/network/migrations/0014_auto_20160916_1719.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-16 15:19 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-network', '0013_auto_20160916_1715'), + ] + + operations = [ + migrations.RemoveField( + model_name='personlistblock', + name='persons', + ), + migrations.AddField( + model_name='personautocomplete', + name='person', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='organization-network.Person'), + preserve_default=False, + ), + ] diff --git a/app/organization/network/migrations/0015_auto_20160916_1732.py b/app/organization/network/migrations/0015_auto_20160916_1732.py new file mode 100644 index 00000000..dfb0acae --- /dev/null +++ b/app/organization/network/migrations/0015_auto_20160916_1732.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-16 15:32 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-network', '0014_auto_20160916_1719'), + ] + + operations = [ + migrations.RemoveField( + model_name='personautocomplete', + name='person', + ), + migrations.AddField( + model_name='personlistblock', + name='person', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='organization-network.Person'), + preserve_default=False, + ), + ] diff --git a/app/organization/network/migrations/0016_auto_20160916_1741.py b/app/organization/network/migrations/0016_auto_20160916_1741.py new file mode 100644 index 00000000..f2bd776d --- /dev/null +++ b/app/organization/network/migrations/0016_auto_20160916_1741.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-16 15:41 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-network', '0015_auto_20160916_1732'), + ] + + operations = [ + migrations.AlterField( + model_name='personlistblock', + name='person', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='person_list_block', to='organization-network.Person', verbose_name='Person'), + ), + ] diff --git a/app/organization/network/migrations/0017_personlistblock_person_list_block.py b/app/organization/network/migrations/0017_personlistblock_person_list_block.py new file mode 100644 index 00000000..f1cad22b --- /dev/null +++ b/app/organization/network/migrations/0017_personlistblock_person_list_block.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-16 16:02 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-network', '0016_auto_20160916_1741'), + ] + + operations = [ + migrations.AddField( + model_name='personlistblock', + name='person_list_block', + field=models.ForeignKey(default=7, on_delete=django.db.models.deletion.CASCADE, to='organization-network.PersonListBlock'), + preserve_default=False, + ), + ] diff --git a/app/organization/network/migrations/0018_auto_20160916_1813.py b/app/organization/network/migrations/0018_auto_20160916_1813.py new file mode 100644 index 00000000..0927472b --- /dev/null +++ b/app/organization/network/migrations/0018_auto_20160916_1813.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-16 16:13 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-network', '0017_personlistblock_person_list_block'), + ] + + operations = [ + migrations.RemoveField( + model_name='personlistblock', + name='person', + ), + migrations.RemoveField( + model_name='personlistblock', + name='person_list_block', + ), + migrations.AddField( + model_name='personautocomplete', + name='person', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='person_list_block', to='organization-network.Person', verbose_name='Person'), + ), + ] diff --git a/app/organization/network/models.py b/app/organization/network/models.py index d22c3da3..dd30ba57 100644 --- a/app/organization/network/models.py +++ b/app/organization/network/models.py @@ -229,6 +229,8 @@ class PersonBlock(Block): class PersonListBlock(Titled): + page = models.ForeignKey(Page, verbose_name=_('Page'), related_name='person_list_block', blank=True, null=True, on_delete=models.SET_NULL) + class Meta: verbose_name = _('Person List') @@ -236,6 +238,15 @@ class PersonListBlock(Titled): return self.title +class PersonAutocomplete(models.Model): + + person_list_block = models.ForeignKey(PersonListBlock, verbose_name=_('Person List Block'), related_name='person_autocomplete', blank=True, null=True, on_delete=models.SET_NULL) + person = models.ForeignKey(Person, verbose_name=_('Person'), related_name='person_list_block', blank=True, null=True, on_delete=models.SET_NULL) + + class Meta: + verbose_name = _('Person autocomplete') + + class DynamicPersonList(DynamicContent, Orderable): person_list_block = models.ForeignKey("PersonListBlock", verbose_name=_('Person List Block'), related_name='dynamic_person_list', blank=True, null=True, on_delete=models.SET_NULL) diff --git a/app/organization/network/translation.py b/app/organization/network/translation.py index faf9564d..dc8d05b9 100644 --- a/app/organization/network/translation.py +++ b/app/organization/network/translation.py @@ -115,3 +115,9 @@ class DynamicPersonListTranslationOptions(TranslationOptions): class PersonListBlockTranslationOptions(TranslationOptions): pass + + +@register(PersonAutocomplete) +class PersonListBlockTranslationOptions(TranslationOptions): + + pass diff --git a/app/organization/network/urls.py b/app/organization/network/urls.py index 01e7e048..b1411764 100644 --- a/app/organization/network/urls.py +++ b/app/organization/network/urls.py @@ -13,7 +13,6 @@ from organization.network.views import * urlpatterns = [ url(r'^(?P.*)/teams/$', TeamListView.as_view(), name="organization-network-team-list"), url(r'^person/(?P.*)/$', PersonDetailView.as_view(), name="organization-network-person-detail"), - url("^dynamic-person-list/$", DynamicPersonListView.as_view(), name='dynamic-person-list'), - url("^dynamic-content-person-list-block/$", DynamicContentPersonListBlockView.as_view(), name='dynamic-content-person-list-block'), - + url("^person-list-block-autocomplete/$", PersonListBlockAutocompleteView.as_view(), name='person-list-block-autocomplete'), + url("^person-autocomplete/$", PersonListView.as_view(), name='person-autocomplete'), ] diff --git a/app/organization/network/views.py b/app/organization/network/views.py index 68ae2403..16233cae 100644 --- a/app/organization/network/views.py +++ b/app/organization/network/views.py @@ -62,27 +62,39 @@ class PersonDetailView(SlugMixin, DetailView): context_object_name = 'person' -class DynamicPersonListView(Select2QuerySetSequenceView): +class PersonListBlockAutocompleteView(autocomplete.Select2QuerySetView): def get_queryset(self): - persons = Person.objects.all() - if self.q: - persons = persons.filter(person_title__icontains=self.q) - qs = autocomplete.QuerySetSequence(persons) + # if not self.request.is_authenticated(): + # return PersonListBlock.objects.none() + + qs = PersonListBlock.objects.all() + + title = self.forwarded.get('title', None) + + if title: + qs = qs.filter(title=title) + if self.q: - qs = qs.filter(person_title__icontains=self.q) - qs = self.mixup_querysets(qs) + qs = qs.filter(title__istartswith=self.q) + return qs -class DynamicContentPersonListBlockView(Select2QuerySetSequenceView): +class PersonListView(autocomplete.Select2QuerySetView): def get_queryset(self): - person_list_blocks = PersonListBlock.objects.all() - if self.q: - person_list_blocks = person_list_blocks.filter(title__icontains=self.q) - qs = autocomplete.QuerySetSequence(person_list_blocks) + # if not self.request.is_authenticated(): + # return PersonListBlock.objects.none() + + qs = Person.objects.all() + + person_title = self.forwarded.get('person_title', None) + + if person_title: + qs = qs.filter(person_title=person_title) + if self.q: - qs = qs.filter(title__icontains=self.q) - qs = self.mixup_querysets(qs) + qs = qs.filter(person_title__istartswith=self.q) + return qs diff --git a/app/organization/pages/admin.py b/app/organization/pages/admin.py index 5b9cb168..26650827 100644 --- a/app/organization/pages/admin.py +++ b/app/organization/pages/admin.py @@ -39,20 +39,20 @@ class PageLinkInline(StackedDynamicInlineAdmin): model = PageLink -class DynamicContentPersonListBlockInline(TabularDynamicInlineAdmin): +class PersonListBlockAutocompleteInline(TabularDynamicInlineAdmin): - model = DynamicPersonListBlockPage - form = DynamicContentPersonListBlockForm - - class Media: - js = ( - static("mezzanine/js/admin/dynamic_inline.js"), - ) + model = PersonListBlock + form = PagePersonListForm class CustomPageAdmin(PageAdmin): - inlines = [PageBlockInline, PageImageInline, PageAudioInline, PageVideoInline, PageLinkInline, DynamicContentPersonListBlockInline] + inlines = [PageBlockInline, PageImageInline, + PageAudioInline, + PageVideoInline, + PageLinkInline, + PersonListBlockAutocompleteInline, + ] class DynamicContentHomeSliderInline(TabularDynamicInlineAdmin): @@ -77,11 +77,5 @@ class HomeAdminDisplayable(BaseTranslationModelAdmin): inlines = [DynamicContentHomeSliderInline, DynamicContentHomeBodyInline ] - - - - - admin.site.register(CustomPage, CustomPageAdmin) admin.site.register(Home, HomeAdminDisplayable) -# admin.site.register(PersonListBlock, PersonListBlockAdmin) -- 2.39.5