From 2c7df796fb736c92ab4426ff5737423b85bbdc79 Mon Sep 17 00:00:00 2001 From: Erik Stein Date: Fri, 8 Dec 2017 19:08:56 +0100 Subject: [PATCH] Added "shared" prefix. --- people/migrations/0001_initial.py | 83 ------------------- people/migrations/__init__.py | 0 setup.py | 13 ++- shared/__init__.py | 2 + {people => shared/people}/__init__.py | 0 {people => shared/people}/admin.py | 7 +- {people => shared/people}/apps.py | 0 {people => shared/people}/controllers.py | 0 shared/people/model_examples.py | 30 +++++++ {people => shared/people}/models.py | 19 ++--- .../people}/templates/people/person_list.html | 0 {people => shared/people}/tests.py | 0 {people => shared/people}/urls.py | 0 {people => shared/people}/views.py | 0 14 files changed, 51 insertions(+), 103 deletions(-) delete mode 100644 people/migrations/0001_initial.py delete mode 100644 people/migrations/__init__.py create mode 100644 shared/__init__.py rename {people => shared/people}/__init__.py (100%) rename {people => shared/people}/admin.py (93%) rename {people => shared/people}/apps.py (100%) rename {people => shared/people}/controllers.py (100%) create mode 100644 shared/people/model_examples.py rename {people => shared/people}/models.py (90%) rename {people => shared/people}/templates/people/person_list.html (100%) rename {people => shared/people}/tests.py (100%) rename {people => shared/people}/urls.py (100%) rename {people => shared/people}/views.py (100%) diff --git a/people/migrations/0001_initial.py b/people/migrations/0001_initial.py deleted file mode 100644 index e464c71..0000000 --- a/people/migrations/0001_initial.py +++ /dev/null @@ -1,83 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.5 on 2017-09-28 18:50 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion -import people.controllers -import shared.utils.fields - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('contenttypes', '0002_remove_content_type_name'), - ] - - operations = [ - migrations.CreateModel( - name='GenericParticipationRel', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('object_id', models.PositiveIntegerField()), - ('order_index', models.IntegerField(default=0, verbose_name='Sortierung')), - ('label', models.CharField(blank=True, max_length=2000, null=True, verbose_name='Weitere Angaben')), - ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), - ], - options={ - 'verbose_name': 'Rolle/Funktion', - 'verbose_name_plural': 'Rollen/Funktionen', - 'ordering': ['role', 'order_index', 'person__sort_name'], - }, - ), - migrations.CreateModel( - name='Person', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_group', models.BooleanField(default=False, help_text='Bitte ankreuzen, wenn es sich um eine Gruppe handelt, und unten die Gruppenmitglieder auswählen', verbose_name='Gruppe')), - ('_is_main_person', models.BooleanField(default=False, editable=False, verbose_name='Haupteintrag')), - ('name', models.CharField(max_length=200, unique=True, verbose_name='Name')), - ('slug', shared.utils.fields.AutoSlugField(help_text='Kurzfassung des Namens für die Adresszeile im Browser. Vorzugsweise englisch, keine Umlaute, nur Bindestrich als Sonderzeichen.', max_length=200, verbose_name='URL-Name')), - ('sort_name', models.CharField(blank=True, max_length=200, verbose_name='Name sortierbar')), - ('main_person', models.ForeignKey(blank=True, help_text='Wenn es sich um eine alternative Schreibweise oder ein Pseudonym handelt, hier den Hauptpersoneneintrag auswählen.', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='pseudonym_set', to='people.Person', verbose_name='Haupteintrag')), - ('members', models.ManyToManyField(blank=True, related_name='groups', to='people.Person', verbose_name='Gruppenmitglieder')), - ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_people.person_set+', to='contenttypes.ContentType')), - ], - options={ - 'verbose_name': 'Person', - 'verbose_name_plural': 'Personen', - 'ordering': ['sort_name', 'name'], - 'abstract': False, - }, - bases=(people.controllers.PersonController, models.Model), - ), - migrations.CreateModel( - name='PersonRole', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('id_text', models.CharField(max_length=20, verbose_name='Bezeichner (intern)')), - ('name_de', models.CharField(max_length=50, verbose_name='Bezeichnung (de)')), - ('name_en', models.CharField(blank=True, max_length=50, null=True, verbose_name='Bezeichnung (en)')), - ('label_de', models.CharField(blank=True, help_text='In der Bibliografie', max_length=200, null=True, verbose_name='Ausgabetext (de)')), - ('label_en', models.CharField(blank=True, max_length=200, null=True, verbose_name='Ausgabetext (en)')), - ('order_index', models.IntegerField(default=0, verbose_name='Sortierung')), - ], - options={ - 'verbose_name': 'Funktion', - 'verbose_name_plural': 'Funktionen', - 'ordering': ['order_index', 'name_de', 'name_en'], - }, - ), - migrations.AddField( - model_name='genericparticipationrel', - name='person', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participations', related_query_name='participations', to='people.Person', verbose_name='Person'), - ), - migrations.AddField( - model_name='genericparticipationrel', - name='role', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='people.PersonRole', verbose_name='Funktion'), - ), - ] diff --git a/people/migrations/__init__.py b/people/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/setup.py b/setup.py index f46e84e..66dfb5a 100755 --- a/setup.py +++ b/setup.py @@ -2,10 +2,16 @@ import os from io import open - from setuptools import find_packages, setup +def get_version(prefix): + import re + with open(os.path.join(prefix, '__init__.py')) as fd: + metadata = dict(re.findall("__([a-z]+)__ = '([^']+)'", fd.read())) + return metadata['version'] + + def read(filename): path = os.path.join(os.path.dirname(__file__), filename) with open(path, encoding='utf-8') as handle: @@ -13,8 +19,8 @@ def read(filename): setup( - name='django-people', - version=__import__('people').__version__, + name='django-shared-people', + version=get_version('shared/people'), description='Person model, mixins and helpers for Django', long_description=read('README.md'), author='Erik Stein', @@ -25,6 +31,7 @@ setup( packages=find_packages( exclude=['tests', 'testapp'] ), + namespace_packages=['shared'], include_package_data=True, install_requires=[ # 'Django>=1.9', commented out to make `pip install -U` easier diff --git a/shared/__init__.py b/shared/__init__.py new file mode 100644 index 0000000..8d17c21 --- /dev/null +++ b/shared/__init__.py @@ -0,0 +1,2 @@ +__import__('pkg_resources').declare_namespace(__name__) + diff --git a/people/__init__.py b/shared/people/__init__.py similarity index 100% rename from people/__init__.py rename to shared/people/__init__.py diff --git a/people/admin.py b/shared/people/admin.py similarity index 93% rename from people/admin.py rename to shared/people/admin.py index 4753e88..fc5ea86 100644 --- a/people/admin.py +++ b/shared/people/admin.py @@ -8,8 +8,6 @@ from django.utils.translation import ugettext_lazy as _ from admin_steroids.options import ImproveRawIdFieldsFormTabularInline -from .models import PersonRole, Person, GenericParticipationRel - class PersonRoleAdmin(admin.ModelAdmin): list_display = ['get_name', 'id_text', 'label_de', 'label_en'] @@ -36,7 +34,7 @@ class PersonAdmin(PersonAdminBase): parameter_name = 'group' def lookups(self, request, model_admin): - return Person.objects.filter(is_group=True).values_list('slug', 'name') + return model_admin.model.objects.filter(is_group=True).values_list('slug', 'name') def queryset(self, request, queryset): if self.value(): @@ -83,7 +81,7 @@ class PersonAdmin(PersonAdminBase): class GenericParticipationInline(ImproveRawIdFieldsFormTabularInline, GenericTabularInline): - model = GenericParticipationRel + model = 'GenericParticipationRel' verbose_name = _("Teilnehmer/in") verbose_name_plural = _("Teilnehmer/innen") fields = ('role', 'person', 'label', 'order_index',) @@ -94,5 +92,6 @@ class GenericParticipationInline(ImproveRawIdFieldsFormTabularInline, GenericTab extra = 0 +# from .models import PersonRole, Person, GenericParticipationRel # admin.site.register(PersonRole, PersonRoleAdmin) # admin.site.register(Person, PersonAdmin) diff --git a/people/apps.py b/shared/people/apps.py similarity index 100% rename from people/apps.py rename to shared/people/apps.py diff --git a/people/controllers.py b/shared/people/controllers.py similarity index 100% rename from people/controllers.py rename to shared/people/controllers.py diff --git a/shared/people/model_examples.py b/shared/people/model_examples.py new file mode 100644 index 0000000..62a6a56 --- /dev/null +++ b/shared/people/model_examples.py @@ -0,0 +1,30 @@ +from django.core.urlresolvers import reverse +from django.utils.translation import ugettext_lazy as _ + +from shared.utils.translation import get_translated_field + +from .controllers import PersonController +from .models import PseudonymMixin, GroupMixin, BasePerson, PersonRoleBase, GenericParticipationRelBase + + +class Person(PersonController, PseudonymMixin, GroupMixin, BasePerson): + class Meta(BasePerson.Meta): + app_label = 'people' + + def get_absolute_url(self): + return reverse('person-detail', kwargs={'slug': self.slug}) + + +class PersonRole(PersonRoleBase): + class Meta(PersonRoleBase.Meta): + verbose_name = _("Funktion") + verbose_name_plural = _("Funktionen") + ordering = ['order_index', 'name_de', 'name_en'] + + def __str__(self): + return self.name + + +class GenericParticipationRel(GenericParticipationRelBase): + class Meta(GenericParticipationRelBase.Meta): + app_label = 'people' diff --git a/people/models.py b/shared/people/models.py similarity index 90% rename from people/models.py rename to shared/people/models.py index 1818145..441a776 100644 --- a/people/models.py +++ b/shared/people/models.py @@ -5,7 +5,6 @@ from __future__ import unicode_literals from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType -from django.core.urlresolvers import reverse from django.db import models from django.utils.encoding import python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ @@ -82,16 +81,8 @@ class BasePerson(PolymorphicModel): super(BasePerson, self).save(*args, **kwargs) -class Person(PersonController, PseudonymMixin, GroupMixin, BasePerson): - class Meta(BasePerson.Meta): - pass - - def get_absolute_url(self): - return reverse('person-detail', kwargs={'slug': self.slug}) - - @python_2_unicode_compatible -class PersonRole(models.Model): +class PersonRoleBase(models.Model): """ Fixtures, non-deletable: author @@ -107,6 +98,7 @@ class PersonRole(models.Model): order_index = models.IntegerField(_("Sortierung"), default=0, blank=False, null=False) class Meta: + abstract = True verbose_name = _("Funktion") verbose_name_plural = _("Funktionen") ordering = ['order_index', 'name_de', 'name_en'] @@ -124,17 +116,18 @@ class PersonRole(models.Model): @python_2_unicode_compatible -class GenericParticipationRel(models.Model): +class GenericParticipationRelBase(models.Model): content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') - person = models.ForeignKey(Person, verbose_name=_("Person"), related_name='participations', related_query_name='participations') - role = models.ForeignKey(PersonRole, verbose_name=_("Funktion")) + person = models.ForeignKey('Person', verbose_name=_("Person"), related_name='participations', related_query_name='participations') + role = models.ForeignKey('PersonRole', verbose_name=_("Funktion")) order_index = models.IntegerField(_("Sortierung"), default=0, blank=False, null=False) label = models.CharField(_("Weitere Angaben"), null=True, blank=True, max_length=2000) # TODO Add label_en class Meta: + abstract = True verbose_name = _("Rolle/Funktion") verbose_name_plural = _("Rollen/Funktionen") ordering = ['role', 'order_index', 'person__sort_name'] diff --git a/people/templates/people/person_list.html b/shared/people/templates/people/person_list.html similarity index 100% rename from people/templates/people/person_list.html rename to shared/people/templates/people/person_list.html diff --git a/people/tests.py b/shared/people/tests.py similarity index 100% rename from people/tests.py rename to shared/people/tests.py diff --git a/people/urls.py b/shared/people/urls.py similarity index 100% rename from people/urls.py rename to shared/people/urls.py diff --git a/people/views.py b/shared/people/views.py similarity index 100% rename from people/views.py rename to shared/people/views.py