From 02c33408fac04245aca5536137adaac2a8d7136a Mon Sep 17 00:00:00 2001 From: Jarmil <jarmil.halamicek@seznam.cz> Date: Wed, 12 Aug 2020 16:14:52 +0200 Subject: [PATCH] WIP: modifikovan model pro vahy programovych bodu, zakladni editace --- program2021/fixtures/characteristic.json | 23 ++++++ .../migrations/0003_auto_20200805_1034.py | 52 +++++++++---- .../migrations/0004_merge_20200812_1337.py | 13 ++++ .../migrations/0005_auto_20200812_1337.py | 78 +++++++++++++++++++ .../migrations/0006_auto_20200812_1556.py | 38 +++++++++ program2021/models.py | 68 +++++++++++++--- 6 files changed, 250 insertions(+), 22 deletions(-) create mode 100644 program2021/fixtures/characteristic.json create mode 100644 program2021/migrations/0004_merge_20200812_1337.py create mode 100644 program2021/migrations/0005_auto_20200812_1337.py create mode 100644 program2021/migrations/0006_auto_20200812_1556.py diff --git a/program2021/fixtures/characteristic.json b/program2021/fixtures/characteristic.json new file mode 100644 index 00000000..8e8f9039 --- /dev/null +++ b/program2021/fixtures/characteristic.json @@ -0,0 +1,23 @@ +[ + { + "model": "program2021.SearchCharacteristic", + "pk": 1, + "fields": { + "name": "Pohlaví - žena" + } + }, + { + "model": "program2021.SearchCharacteristic", + "pk": 2, + "fields": { + "name": "Pohlaví - muž" + } + }, + { + "model": "program2021.SearchCharacteristic", + "pk": 3, + "fields": { + "name": "Pohlaví - nezadáno" + } + } +] diff --git a/program2021/migrations/0003_auto_20200805_1034.py b/program2021/migrations/0003_auto_20200805_1034.py index 2f1685a8..396d02db 100644 --- a/program2021/migrations/0003_auto_20200805_1034.py +++ b/program2021/migrations/0003_auto_20200805_1034.py @@ -1,33 +1,59 @@ # Generated by Django 3.0.8 on 2020-08-05 08:34 -from django.db import migrations, models import django.db.models.deletion import modelcluster.contrib.taggit import modelcluster.fields +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('taggit', '0003_taggeditem_add_unique_index'), - ('program2021', '0002_auto_20200805_0726'), + ("taggit", "0003_taggeditem_add_unique_index"), + ("program2021", "0002_auto_20200805_0726"), ] operations = [ migrations.CreateModel( - name='Program2021PointPageSearchTag', + name="Program2021PointPageSearchTag", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('content_object', modelcluster.fields.ParentalKey(on_delete=django.db.models.deletion.CASCADE, to='program2021.Program2021PointPage')), - ('tag', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='program2021_program2021pointpagesearchtag_items', to='taggit.Tag')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "content_object", + modelcluster.fields.ParentalKey( + on_delete=django.db.models.deletion.CASCADE, + to="program2021.Program2021PointPage", + ), + ), + ( + "tag", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="program2021_program2021pointpagesearchtag_items", + to="taggit.Tag", + ), + ), ], - options={ - 'abstract': False, - }, + options={"abstract": False,}, ), migrations.AddField( - model_name='program2021pointpage', - name='search_tags', - field=modelcluster.contrib.taggit.ClusterTaggableManager(blank=True, help_text='Tagy pro vyhledavani. Musi byt zadany presne, aby to fungovalo. Tagy jsou deleny do skupin se spolecnym prefixem, napr. "gender". \nPriklad: chces-li programovy bod pouze pro muze, zadej tag "gender-male", pokud je to jedno, musis zadat tag "gender-every". Seznam tagu a skupin:\nx y z\nb d f\nl o p q\n ', related_name='search_tags', through='program2021.Program2021PointPageSearchTag', to='taggit.Tag', verbose_name='Tags'), + model_name="program2021pointpage", + name="search_tags", + field=modelcluster.contrib.taggit.ClusterTaggableManager( + blank=True, + help_text='Tagy pro vyhledavani. Musi byt zadany presne, aby to fungovalo. Tagy jsou deleny do skupin se spolecnym prefixem, napr. "gender". \nPriklad: chces-li programovy bod pouze pro muze, zadej tag "gender-male", pokud je to jedno, musis zadat tag "gender-every". Seznam tagu a skupin:\nx y z\nb d f\nl o p q\n ', + related_name="search_tags", + through="program2021.Program2021PointPageSearchTag", + to="taggit.Tag", + verbose_name="Tags", + ), ), ] diff --git a/program2021/migrations/0004_merge_20200812_1337.py b/program2021/migrations/0004_merge_20200812_1337.py new file mode 100644 index 00000000..8fed978f --- /dev/null +++ b/program2021/migrations/0004_merge_20200812_1337.py @@ -0,0 +1,13 @@ +# Generated by Django 3.0.8 on 2020-08-12 11:37 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("program2021", "0003_auto_20200805_1034"), + ("program2021", "0003_program2021pointpage_image_title"), + ] + + operations = [] diff --git a/program2021/migrations/0005_auto_20200812_1337.py b/program2021/migrations/0005_auto_20200812_1337.py new file mode 100644 index 00000000..d2391ed2 --- /dev/null +++ b/program2021/migrations/0005_auto_20200812_1337.py @@ -0,0 +1,78 @@ +# Generated by Django 3.0.8 on 2020-08-12 11:37 + +import django.db.models.deletion +import modelcluster.contrib.taggit +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("taggit", "0003_taggeditem_add_unique_index"), + ("program2021", "0004_merge_20200812_1337"), + ] + + operations = [ + migrations.CreateModel( + name="SearchCharacteristic", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "name", + models.CharField( + max_length=200, + verbose_name="lidský název pro použití v administraci", + ), + ), + ], + ), + migrations.AlterField( + model_name="program2021pointpage", + name="search_tags", + field=modelcluster.contrib.taggit.ClusterTaggableManager( + blank=True, + help_text='Deleny do skupin se spolecnym prefixem, napr. "gender". Pokud je bod spolecny pro vsechny moznosti dane skupiny, pouzij tag se suffixem "-every". \nPriklad: chces-li programovy bod pouze pro muze, zadej tag "gender-male", pokud je to jedno, musis zadat tag "gender-every". \nPro kazdou skupinu musis zadat aspon jeden tag, jinak se bod nedostane nikdy do vysledku vyhledavani. Seznam tagu po skupinach:\n(gender-male gender-female gender-every) \n(age-30 age-50 age-65 age-99 age-every) \n(kids-yes kids-no kids-every)\n(occupation-student occupation-employee-public occupation-employee-private occupation-entrepreneur occupation-maternity occupation-retired occupation-every)\n(wealth-excelent wealth-good wealth-average wealth-bad wealth-every)\n(travel-bike travel-car travel-public travel-every)\n(housing-metropolis housing-town housing-village housing-every) \n(education-zs education-ss education-maturita education-vs education-every)\n ', + related_name="search_tags", + through="program2021.Program2021PointPageSearchTag", + to="taggit.Tag", + verbose_name="Tagy pro vyhledávání", + ), + ), + migrations.CreateModel( + name="CharacteristicWeight", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("weight", models.IntegerField()), + ( + "program_point", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="program2021.Program2021PointPage", + ), + ), + ( + "search_characteristic", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="program2021.SearchCharacteristic", + ), + ), + ], + ), + ] diff --git a/program2021/migrations/0006_auto_20200812_1556.py b/program2021/migrations/0006_auto_20200812_1556.py new file mode 100644 index 00000000..2741e763 --- /dev/null +++ b/program2021/migrations/0006_auto_20200812_1556.py @@ -0,0 +1,38 @@ +# Generated by Django 3.0.8 on 2020-08-12 13:56 + +import django.db.models.deletion +import modelcluster.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("program2021", "0005_auto_20200812_1337"), + ] + + operations = [ + migrations.AlterField( + model_name="characteristicweight", + name="program_point", + field=modelcluster.fields.ParentalKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="program_point_link", + to="program2021.Program2021PointPage", + ), + ), + migrations.AlterField( + model_name="characteristicweight", + name="search_characteristic", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="program2021.SearchCharacteristic", + verbose_name="Charakteristika", + ), + ), + migrations.AlterField( + model_name="characteristicweight", + name="weight", + field=models.IntegerField(verbose_name="Váha"), + ), + ] diff --git a/program2021/models.py b/program2021/models.py index 15de764f..4c8abad7 100644 --- a/program2021/models.py +++ b/program2021/models.py @@ -6,6 +6,7 @@ from taggit.models import TaggedItemBase from wagtail.admin.edit_handlers import ( FieldPanel, HelpPanel, + InlinePanel, MultiFieldPanel, ObjectList, StreamFieldPanel, @@ -19,6 +20,34 @@ from wagtail.images.edit_handlers import ImageChooserPanel from wagtailmetadata.models import MetadataPageMixin +class SearchCharacteristic(models.Model): + """ Ciselnik charakteristik odesilanych uzivatelem, napriklad vek65+ """ + + name = models.CharField("Název", max_length=200, blank=False, null=False) + + def __str__(self): + return self.name + + +class CharacteristicWeight(models.Model): + """ Prirazeni vahy jedntlivych charakteristik programovym blokum """ + + search_characteristic = models.ForeignKey( + SearchCharacteristic, on_delete=models.CASCADE, verbose_name="Zadáno" + ) + program_point = ParentalKey( + "Program2021PointPage", + on_delete=models.CASCADE, + related_name="program_point_link", + ) + weight = models.IntegerField(verbose_name="Váha") + + panels = [ + FieldPanel("search_characteristic"), + FieldPanel("weight"), + ] + + class Program2021HomePage(Page): ### FIELDS headline = models.CharField( @@ -70,12 +99,26 @@ class Program2021HomePage(Page): required_tags.append("travel-every") # selecty mohou mit vzdy jen jednu hodnotu - for x in ["age", "gender", "kids", "occupation", "wealth", "housing", "education"]: + for x in [ + "age", + "gender", + "kids", + "occupation", + "wealth", + "housing", + "education", + ]: required_tags.append(x + "-" + (request.POST.get(x, "") or "every")) # TODO : rozpracovana vec, funguje spatne, vrati vsechny body co maji aspon jeden tag # bude treba prevest na vahy tagu - context["points"] = self.get_children().live().specific().filter(program2021pointpage__search_tags__name__in=required_tags).distinct() + context["points"] = ( + self.get_children() + .live() + .specific() + .filter(program2021pointpage__search_tags__name__in=required_tags) + .distinct() + ) raise NotImplementedError else: @@ -227,20 +270,24 @@ class Program2021PointPage(Page, MetadataPageMixin): ) owner_url = models.URLField("odkaz na garanta", blank=True, null=True) tags = ClusterTaggableManager(through=Program2021PointPageTag, blank=True) - search_tags = ClusterTaggableManager("Tagy pro vyhledávání", through=Program2021PointPageSearchTag, blank=True, + search_tags = ClusterTaggableManager( + "Tagy pro vyhledávání", + through=Program2021PointPageSearchTag, + blank=True, related_name="search_tags", - help_text="""Deleny do skupin se spolecnym prefixem, napr. "gender". Pokud je bod spolecny pro vsechny moznosti dane skupiny, pouzij tag se suffixem "-every". -Priklad: chces-li programovy bod pouze pro muze, zadej tag "gender-male", pokud je to jedno, musis zadat tag "gender-every". + help_text="""Deleny do skupin se spolecnym prefixem, napr. "gender". Pokud je bod spolecny pro vsechny moznosti dane skupiny, pouzij tag se suffixem "-every". +Priklad: chces-li programovy bod pouze pro muze, zadej tag "gender-male", pokud je to jedno, musis zadat tag "gender-every". Pro kazdou skupinu musis zadat aspon jeden tag, jinak se bod nedostane nikdy do vysledku vyhledavani. Seznam tagu po skupinach: -(gender-male gender-female gender-every) -(age-30 age-50 age-65 age-99 age-every) +(gender-male gender-female gender-every) +(age-30 age-50 age-65 age-99 age-every) (kids-yes kids-no kids-every) (occupation-student occupation-employee-public occupation-employee-private occupation-entrepreneur occupation-maternity occupation-retired occupation-every) (wealth-excelent wealth-good wealth-average wealth-bad wealth-every) (travel-bike travel-car travel-public travel-every) -(housing-metropolis housing-town housing-village housing-every) +(housing-metropolis housing-town housing-village housing-every) (education-zs education-ss education-maturita education-vs education-every) - """) + """, + ) ### PANELS @@ -286,6 +333,8 @@ Pro kazdou skupinu musis zadat aspon jeden tag, jinak se bod nedostane nikdy do StreamFieldPanel("faq"), ] + search_panels = [InlinePanel("program_point_link", label="Váhy vyhledávání")] + promote_panels = [ MultiFieldPanel( [ @@ -302,6 +351,7 @@ Pro kazdou skupinu musis zadat aspon jeden tag, jinak se bod nedostane nikdy do [ ObjectList(content_panels, heading=gettext_lazy("Content")), ObjectList(benefits_content_panels, heading="Benefity"), + ObjectList(search_panels, heading="Hledání"), ObjectList(faq_content_panels, heading="FAQ"), ObjectList(promote_panels, heading=gettext_lazy("Promote")), ] -- GitLab