From 24580655ffab29f086756e17db0b6b84483ffbb0 Mon Sep 17 00:00:00 2001 From: Guillaume Pellerin Date: Tue, 9 Aug 2016 15:01:46 +0200 Subject: [PATCH] Make more abtract classes and linked resources (images, blocks, etc) --- app/organization/core/admin.py | 4 + .../migrations/0010_auto_20160808_0118.py | 31 +++++++ .../migrations/0011_auto_20160809_1413.py | 41 +++++++++ app/organization/core/models.py | 89 +++++++++++++++---- app/organization/core/translation.py | 2 +- .../migrations/0010_auto_20160808_0118.py | 19 ++++ app/organization/project/admin.py | 24 ++++- .../migrations/0003_auto_20160808_0118.py | 80 +++++++++++++++++ .../migrations/0004_auto_20160809_1413.py | 84 +++++++++++++++++ app/organization/project/models.py | 19 +++- app/organization/project/translation.py | 17 ++++ app/organization/team/admin.py | 22 +++-- .../migrations/0012_auto_20160808_0118.py | 60 +++++++++++++ .../migrations/0013_auto_20160809_1413.py | 76 ++++++++++++++++ app/organization/team/models.py | 60 ++++--------- app/organization/team/translation.py | 10 ++- 16 files changed, 562 insertions(+), 76 deletions(-) create mode 100644 app/organization/core/migrations/0010_auto_20160808_0118.py create mode 100644 app/organization/core/migrations/0011_auto_20160809_1413.py create mode 100644 app/organization/magazine/migrations/0010_auto_20160808_0118.py create mode 100644 app/organization/project/migrations/0003_auto_20160808_0118.py create mode 100644 app/organization/project/migrations/0004_auto_20160809_1413.py create mode 100644 app/organization/team/migrations/0012_auto_20160808_0118.py create mode 100644 app/organization/team/migrations/0013_auto_20160809_1413.py diff --git a/app/organization/core/admin.py b/app/organization/core/admin.py index 3f9b033f..47e8e3bc 100644 --- a/app/organization/core/admin.py +++ b/app/organization/core/admin.py @@ -14,8 +14,12 @@ class PageImageInline(TabularDynamicInlineAdmin): model = PageImage + class BasicPageAdmin(PageAdmin): inlines = [PageBlockInline, PageImageInline] + + admin.site.register(BasicPage, BasicPageAdmin) +admin.site.register(LinkType) diff --git a/app/organization/core/migrations/0010_auto_20160808_0118.py b/app/organization/core/migrations/0010_auto_20160808_0118.py new file mode 100644 index 00000000..6799e47d --- /dev/null +++ b/app/organization/core/migrations/0010_auto_20160808_0118.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-07 23:18 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-core', '0009_pageblock_with_separator'), + ] + + operations = [ + migrations.CreateModel( + name='LinkType', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=256, verbose_name='name')), + ('slug', models.SlugField(blank=True, help_text='Use this field to define a simple identifier that can be used to style the different link types (i.e. assign social media icons to them)', max_length=256, verbose_name='slug')), + ('ordering', models.PositiveIntegerField(blank=True, null=True, verbose_name='ordering')), + ], + options={ + 'ordering': ['ordering'], + }, + ), + migrations.AlterModelOptions( + name='pageimage', + options={'ordering': ('_order',), 'verbose_name': 'image', 'verbose_name_plural': 'images'}, + ), + ] diff --git a/app/organization/core/migrations/0011_auto_20160809_1413.py b/app/organization/core/migrations/0011_auto_20160809_1413.py new file mode 100644 index 00000000..3b0f766d --- /dev/null +++ b/app/organization/core/migrations/0011_auto_20160809_1413.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-09 12:13 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-core', '0010_auto_20160808_0118'), + ] + + operations = [ + migrations.AlterField( + model_name='pageimage', + name='credits', + field=models.CharField(blank=True, max_length=256, null=True, verbose_name='credits'), + ), + migrations.AlterField( + model_name='pageimage', + name='description', + field=models.TextField(blank=True, verbose_name='description'), + ), + migrations.AlterField( + model_name='pageimage', + name='description_en', + field=models.TextField(blank=True, null=True, verbose_name='description'), + ), + migrations.AlterField( + model_name='pageimage', + name='description_fr', + field=models.TextField(blank=True, null=True, verbose_name='description'), + ), + migrations.AlterField( + model_name='pageimage', + name='page', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pages.Page', verbose_name='page'), + ), + ] diff --git a/app/organization/core/models.py b/app/organization/core/models.py index b9a5f5d4..c1b7c746 100644 --- a/app/organization/core/models.py +++ b/app/organization/core/models.py @@ -55,6 +55,7 @@ class SubTitle(models.Model): class Meta: abstract = True + class Category(Named): """Category description)""" @@ -71,31 +72,22 @@ class BasicPage(Page, SubTitle, Photo, RichText): verbose_name = 'basic page' -class PageBlock(Titled, RichText): +class Block(RichText, Titled): - page = models.ForeignKey(Page, verbose_name=_('page'), blank=True, null=True, on_delete=models.SET_NULL) with_separator = models.BooleanField(default=False) background_color = models.CharField(_('background color'), max_length=32, choices=COLOR_CHOICES, blank=True) class Meta: - verbose_name = 'page block' - + abstract = True -class PageImage(Orderable): - """ - An image for a page - """ - file = FileField(_("Image"), max_length=1024, format="Image", upload_to="images/pages") - description = models.TextField(_('photo description'), blank=True) - credits = models.CharField(_('photo credits'), max_length=256, blank=True, null=True) - page = models.ForeignKey(Page) +class Image(Description, Orderable): + file = FileField(_("Image"), max_length=1024, format="Image", upload_to="images") + credits = models.CharField(_('credits'), max_length=256, blank=True, null=True) class Meta: - verbose_name = _("Image") - verbose_name_plural = _("Images") - order_with_respect_to = "page" + abstract = True def __str__(self): value = self.description @@ -104,3 +96,70 @@ class PageImage(Orderable): if not value: value = "" return value + + +class PageBlock(Block): + + page = models.ForeignKey(Page, verbose_name=_('page'), blank=True, null=True, on_delete=models.SET_NULL) + + class Meta: + verbose_name = 'page block' + + +class PageImage(Image): + + page = models.ForeignKey(Page, verbose_name=_('page')) + + class Meta: + verbose_name = _("image") + verbose_name_plural = _("images") + order_with_respect_to = "page" + + +class LinkType(models.Model): + """ + A link type could be ``Facebook`` or ``Twitter`` or ``Website``. + This is masterdata that should be created by the admins when the site is + deployed for the first time. + :ordering: Enter numbers here if you want links to be displayed in a + special order. + """ + + name = models.CharField(max_length=256, verbose_name=_('name')) + slug = models.SlugField(max_length=256, verbose_name=_('slug'), help_text=_( + 'Use this field to define a simple identifier that can be used' + ' to style the different link types (i.e. assign social media' + ' icons to them)'), + blank=True, + ) + ordering = models.PositiveIntegerField(verbose_name=_('ordering'), null=True, blank=True) + + class Meta: + ordering = ['ordering', ] + + def __str__(self): + return self.name + + +class Link(models.Model): + """A person can have many links.""" + + link_type = models.ForeignKey(LinkType, verbose_name=_('link type')) + url = models.URLField(verbose_name=_('URL')) + + class Meta: + abstract = True + verbose_name = _('link') + verbose_name_plural = _('links') + + def __str__(self): + return self.url + + +class Period(models.Model): + + date_begin = models.DateField(_('begin date'), null=True, blank=True) + date_end = models.DateField(_('end date'), null=True, blank=True) + + class Meta: + abstract = True diff --git a/app/organization/core/translation.py b/app/organization/core/translation.py index 31d20b13..be8346b8 100644 --- a/app/organization/core/translation.py +++ b/app/organization/core/translation.py @@ -1,7 +1,7 @@ from modeltranslation.translator import translator, register, TranslationOptions from mezzanine.pages.models import Page, RichText from mezzanine.pages.translation import TranslatedRichText -from organization.core.models import BasicPage, PageBlock, PageImage +from organization.core.models import * # @register(SubTitle) # class SubTitleTranslationOptions(TranslationOptions): diff --git a/app/organization/magazine/migrations/0010_auto_20160808_0118.py b/app/organization/magazine/migrations/0010_auto_20160808_0118.py new file mode 100644 index 00000000..8a70bcae --- /dev/null +++ b/app/organization/magazine/migrations/0010_auto_20160808_0118.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-07 23:18 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-magazine', '0009_brief_sort_order'), + ] + + operations = [ + migrations.AlterModelOptions( + name='brief', + options={'ordering': ['sort_order'], 'verbose_name': 'brief'}, + ), + ] diff --git a/app/organization/project/admin.py b/app/organization/project/admin.py index 19a227a3..0f3a3347 100644 --- a/app/organization/project/admin.py +++ b/app/organization/project/admin.py @@ -1,11 +1,26 @@ from copy import deepcopy -from django.contrib import admin -from organization.project.models import Project -#from custom.admin import SubTitleAdmin from django.contrib import admin from django.utils.translation import ugettext_lazy as _ -from mezzanine.core.admin import DisplayableAdmin, OwnableAdmin + +from mezzanine.core.admin import * + +from organization.project.models import * + + +class ProjectLinkInline(StackedDynamicInlineAdmin): + + model = ProjectLink + + +class ProjectImageInline(StackedDynamicInlineAdmin): + + model = ProjectImage + + +class ProjectBlockInline(StackedDynamicInlineAdmin): + + model = ProjectBlock class ProjectAdmin(admin.ModelAdmin): @@ -16,6 +31,7 @@ class ProjectAdmin(admin.ModelAdmin): class ProjectAdminDisplayable(DisplayableAdmin): fieldsets = deepcopy(ProjectAdmin.fieldsets) + inlines = [ProjectImageInline, ProjectBlockInline, ProjectLinkInline, ] admin.site.register(Project, ProjectAdminDisplayable) diff --git a/app/organization/project/migrations/0003_auto_20160808_0118.py b/app/organization/project/migrations/0003_auto_20160808_0118.py new file mode 100644 index 00000000..1838ed61 --- /dev/null +++ b/app/organization/project/migrations/0003_auto_20160808_0118.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-07 23:18 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import mezzanine.core.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-core', '0010_auto_20160808_0118'), + ('organization-project', '0002_auto_20160715_1807'), + ] + + operations = [ + migrations.CreateModel( + name='ProjectBlock', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content', mezzanine.core.fields.RichTextField(verbose_name='Content')), + ('title', models.CharField(max_length=1024, verbose_name='title')), + ('with_separator', models.BooleanField(default=False)), + ('background_color', models.CharField(blank=True, choices=[('black', 'black'), ('yellow', 'yellow'), ('red', 'red')], max_length=32, verbose_name='background color')), + ], + options={ + 'verbose_name': 'project block', + }, + ), + migrations.CreateModel( + name='ProjectImage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('_order', mezzanine.core.fields.OrderField(null=True, verbose_name='Order')), + ('file', mezzanine.core.fields.FileField(max_length=1024, verbose_name='Image')), + ('description', models.TextField(blank=True, verbose_name='photo description')), + ('credits', models.CharField(blank=True, max_length=256, null=True, verbose_name='photo credits')), + ], + options={ + 'ordering': ('_order',), + 'verbose_name': 'project image', + }, + ), + migrations.CreateModel( + name='ProjectLink', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('url', models.URLField(verbose_name='URL')), + ('link_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organization-core.LinkType', verbose_name='link type')), + ], + options={ + 'verbose_name': 'project link', + }, + ), + migrations.AlterModelOptions( + name='project', + options={'verbose_name': 'project'}, + ), + migrations.AddField( + model_name='project', + name='website', + field=models.URLField(blank=True, max_length=512, verbose_name='website'), + ), + migrations.AddField( + model_name='projectlink', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organization-project.Project'), + ), + migrations.AddField( + model_name='projectimage', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organization-project.Project'), + ), + migrations.AddField( + model_name='projectblock', + name='project', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='organization-project.Project', verbose_name='project'), + ), + ] diff --git a/app/organization/project/migrations/0004_auto_20160809_1413.py b/app/organization/project/migrations/0004_auto_20160809_1413.py new file mode 100644 index 00000000..3863030d --- /dev/null +++ b/app/organization/project/migrations/0004_auto_20160809_1413.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-09 12:13 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import mezzanine.core.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-project', '0003_auto_20160808_0118'), + ] + + operations = [ + migrations.AlterModelOptions( + name='projectblock', + options={}, + ), + migrations.AlterModelOptions( + name='projectimage', + options={'ordering': ('_order',)}, + ), + migrations.AlterModelOptions( + name='projectlink', + options={'verbose_name': 'link', 'verbose_name_plural': 'links'}, + ), + migrations.AddField( + model_name='projectblock', + name='content_en', + field=mezzanine.core.fields.RichTextField(null=True, verbose_name='Content'), + ), + migrations.AddField( + model_name='projectblock', + name='content_fr', + field=mezzanine.core.fields.RichTextField(null=True, verbose_name='Content'), + ), + migrations.AddField( + model_name='projectblock', + name='title_en', + field=models.CharField(max_length=1024, null=True, verbose_name='title'), + ), + migrations.AddField( + model_name='projectblock', + name='title_fr', + field=models.CharField(max_length=1024, null=True, verbose_name='title'), + ), + migrations.AddField( + model_name='projectimage', + name='description_en', + field=models.TextField(blank=True, null=True, verbose_name='description'), + ), + migrations.AddField( + model_name='projectimage', + name='description_fr', + field=models.TextField(blank=True, null=True, verbose_name='description'), + ), + migrations.AlterField( + model_name='projectblock', + name='project', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='blocks', to='organization-project.Project', verbose_name='project'), + ), + migrations.AlterField( + model_name='projectimage', + name='credits', + field=models.CharField(blank=True, max_length=256, null=True, verbose_name='credits'), + ), + migrations.AlterField( + model_name='projectimage', + name='description', + field=models.TextField(blank=True, verbose_name='description'), + ), + migrations.AlterField( + model_name='projectimage', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='images', to='organization-project.Project'), + ), + migrations.AlterField( + model_name='projectlink', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='links', to='organization-project.Project'), + ), + ] diff --git a/app/organization/project/models.py b/app/organization/project/models.py index ef8dcbc1..1ab7cfa1 100644 --- a/app/organization/project/models.py +++ b/app/organization/project/models.py @@ -3,8 +3,9 @@ from __future__ import unicode_literals from django.db import models from django.utils.translation import ugettext_lazy as _ -from mezzanine.core.models import RichText, Displayable, Slugged +from mezzanine.core.models import RichText, Displayable, Slugged, Orderable +from organization.core.models import * from organization.team.models import Person, Team, Organization @@ -15,9 +16,25 @@ class Project(Displayable, RichText): partner_persons = models.ManyToManyField(Person, verbose_name=_('partner persons'), blank=True) partner_teams = models.ManyToManyField(Team, verbose_name=_('partner teams'), related_name='project_partners', blank=True) partner_organizations = models.ManyToManyField(Organization, verbose_name=_('partner organizations'), blank=True) + website = models.URLField(_('website'), max_length=512, blank=True) class Meta: verbose_name = _('project') def __unicode__(self): return self.title + + +class ProjectBlock(Block): + + project = models.ForeignKey(Project, verbose_name=_('project'), related_name='blocks', blank=True, null=True, on_delete=models.SET_NULL) + + +class ProjectImage(Image): + + project = models.ForeignKey(Project, related_name='images') + + +class ProjectLink(Link): + + project = models.ForeignKey(Project, related_name='links') diff --git a/app/organization/project/translation.py b/app/organization/project/translation.py index 7f9d3d1f..cb835d1a 100644 --- a/app/organization/project/translation.py +++ b/app/organization/project/translation.py @@ -7,3 +7,20 @@ from organization.project.models import * class ProjectTranslationOptions(TranslationOptions): fields = ('title', 'description', 'content') + + +@register(ProjectImage) +class ProjectImageTranslationOptions(TranslationOptions): + + fields = ('description',) + + +@register(ProjectLink) +class ProjectLinkTranslationOptions(TranslationOptions): + pass + + +@register(ProjectBlock) +class ProjectBlockTranslationOptions(TranslationOptions): + + fields = ('title', 'content', ) diff --git a/app/organization/team/admin.py b/app/organization/team/admin.py index 9467b975..7830655f 100644 --- a/app/organization/team/admin.py +++ b/app/organization/team/admin.py @@ -3,8 +3,9 @@ from django import forms from copy import deepcopy from mezzanine.core.admin import * from mezzanine.pages.admin import PageAdmin + from organization.team.models import * -from organization.core.admin import PageBlockInline, PageImageInline +from organization.core.admin import * class OrganizationAdmin(BaseTranslationModelAdmin): @@ -12,15 +13,9 @@ class OrganizationAdmin(BaseTranslationModelAdmin): model = Organization -class ActivityAdmin(BaseTranslationModelAdmin): - - model = Activity - - -class ActivityInline(StackedDynamicInlineAdmin): +class PersonActivityInline(StackedDynamicInlineAdmin): - model = Activity - filter_horizontal = ['teams', ] + model = PersonActivity class TeamAdmin(PageAdmin): @@ -38,10 +33,15 @@ class PersonAdminBase(admin.ModelAdmin): model = Person +class PersonLinkInline(StackedDynamicInlineAdmin): + + model = PersonLink + + class PersonAdmin(BaseTranslationModelAdmin): model = Person - inlines = [ActivityInline,] + inlines = [PersonActivityInline, PersonLinkInline, ] first_fields = ['first_name', 'last_name', 'title', 'gender', 'user'] def get_fieldsets(self, request, obj = None): @@ -56,6 +56,4 @@ admin.site.register(Organization, OrganizationAdmin) admin.site.register(OrganizationType) admin.site.register(Department, DepartmentAdmin) admin.site.register(Team, TeamAdmin) -# admin.site.register(Team) admin.site.register(Person, PersonAdmin) -# admin.site.register(Activity, ActivityAdmin) diff --git a/app/organization/team/migrations/0012_auto_20160808_0118.py b/app/organization/team/migrations/0012_auto_20160808_0118.py new file mode 100644 index 00000000..e18a1024 --- /dev/null +++ b/app/organization/team/migrations/0012_auto_20160808_0118.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-07 23:18 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-core', '0010_auto_20160808_0118'), + ('organization-team', '0011_auto_20160727_1631'), + ] + + operations = [ + migrations.CreateModel( + name='PersonLink', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('url', models.URLField(verbose_name='URL')), + ], + options={ + 'verbose_name': 'person link', + }, + ), + migrations.RemoveField( + model_name='link', + name='link_type', + ), + migrations.RemoveField( + model_name='link', + name='person', + ), + migrations.RemoveField( + model_name='organization', + name='url', + ), + migrations.AddField( + model_name='organization', + name='website', + field=models.URLField(blank=True, max_length=512, verbose_name='website'), + ), + migrations.DeleteModel( + name='Link', + ), + migrations.DeleteModel( + name='LinkType', + ), + migrations.AddField( + model_name='personlink', + name='link_type', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organization-core.LinkType', verbose_name='link type'), + ), + migrations.AddField( + model_name='personlink', + name='person', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organization-team.Person', verbose_name='person'), + ), + ] diff --git a/app/organization/team/migrations/0013_auto_20160809_1413.py b/app/organization/team/migrations/0013_auto_20160809_1413.py new file mode 100644 index 00000000..d1e0a906 --- /dev/null +++ b/app/organization/team/migrations/0013_auto_20160809_1413.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-09 12:13 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import mezzanine.core.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-core', '0011_auto_20160809_1413'), + ('organization-team', '0012_auto_20160808_0118'), + ] + + operations = [ + migrations.CreateModel( + name='PersonActivity', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content', mezzanine.core.fields.RichTextField(verbose_name='Content')), + ('content_fr', mezzanine.core.fields.RichTextField(null=True, verbose_name='Content')), + ('content_en', mezzanine.core.fields.RichTextField(null=True, verbose_name='Content')), + ('description', models.TextField(blank=True, verbose_name='description')), + ('description_fr', models.TextField(blank=True, null=True, verbose_name='description')), + ('description_en', models.TextField(blank=True, null=True, verbose_name='description')), + ('date_begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('date_end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('role', models.CharField(blank=True, max_length=512, verbose_name='role')), + ], + options={ + 'verbose_name_plural': 'activities', + 'verbose_name': 'activity', + }, + ), + migrations.CreateModel( + name='TeamLink', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('url', models.URLField(verbose_name='URL')), + ('link_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organization-core.LinkType', verbose_name='link type')), + ('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organization-team.Team', verbose_name='links')), + ], + options={ + 'verbose_name': 'link', + 'verbose_name_plural': 'links', + 'abstract': False, + }, + ), + migrations.RemoveField( + model_name='activity', + name='person', + ), + migrations.RemoveField( + model_name='activity', + name='teams', + ), + migrations.RemoveField( + model_name='person', + name='organization', + ), + migrations.DeleteModel( + name='Activity', + ), + migrations.AddField( + model_name='personactivity', + name='person', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organization-team.Person', verbose_name='person'), + ), + migrations.AddField( + model_name='personactivity', + name='team', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organization-team.Team', verbose_name='team'), + ), + ] diff --git a/app/organization/team/models.py b/app/organization/team/models.py index 580d043f..385b7e38 100644 --- a/app/organization/team/models.py +++ b/app/organization/team/models.py @@ -22,7 +22,7 @@ from mezzanine.utils.models import AdminThumbMixin, upload_to from mezzanine.galleries.models import BaseGallery from organization.media.models import Photo -from organization.core.models import Named, Titled, Description, SubTitle +from organization.core.models import * from django_countries.fields import CountryField # from .nationalities.fields import NationalityField @@ -64,7 +64,7 @@ class Organization(Slugged, Description, Address, Photo): """(Organization description)""" type = models.ForeignKey('OrganizationType', verbose_name=_('organization type'), blank=True, null=True, on_delete=models.SET_NULL) - url = models.URLField(_('URL'), max_length=512, blank=True) + website = models.URLField(_('website'), max_length=512, blank=True) is_on_map = models.BooleanField(_('is on map'), default=True) class Meta: @@ -110,7 +110,6 @@ class Person(Displayable, AdminThumbMixin, Photo): last_name = models.CharField(_('last name'), max_length=255, blank=True, null=True) birthday = models.DateField(_('birthday'), blank=True, null=True) bio = RichTextField(_('biography'), blank=True) - organization = models.ForeignKey('Organization', verbose_name=_('organization'), blank=True, null=True, on_delete=models.SET_NULL) class Meta: verbose_name = _('person') @@ -143,57 +142,36 @@ class Person(Displayable, AdminThumbMixin, Photo): super(Person, self).save(*args, **kwargs) -class Link(models.Model): - """A person can have many links.""" - - person = models.ForeignKey('Person', verbose_name=_('person')) - link_type = models.ForeignKey('LinkType', verbose_name=_('link type')) - url = models.URLField(verbose_name=_('URL')) +class TeamLink(Link): - class Meta: - verbose_name = _('link') + team = models.ForeignKey(Team, verbose_name=_('links')) def __str__(self): return self.url -class LinkType(models.Model): - """ - A link type could be ``Facebook`` or ``Twitter`` or ``Website``. - This is masterdata that should be created by the admins when the site is - deployed for the first time. - :ordering: Enter numbers here if you want links to be displayed in a - special order. - """ - - name = models.CharField(max_length=256, verbose_name=_('name')) - slug = models.SlugField(max_length=256, verbose_name=_('slug'), help_text=_( - 'Use this field to define a simple identifier that can be used' - ' to style the different link types (i.e. assign social media' - ' icons to them)'), - blank=True, - ) - ordering = models.PositiveIntegerField(verbose_name=_('ordering'), null=True, blank=True) - - class Meta: - ordering = ['ordering', ] - - def __str__(self): - return self.name - - -class Activity(RichText): +class PersonActivity(Description, Period, RichText): """(Activity description)""" person = models.ForeignKey('Person', verbose_name=_('person')) - teams = models.ManyToManyField('Team', verbose_name=_('teams')) - date_begin = models.DateField(_('begin date'), null=True, blank=True) - date_end = models.DateField(_('end date'), null=True, blank=True) + team = models.ForeignKey('Team', verbose_name=_('team')) role = models.CharField(_('role'), blank=True, max_length=512) - description = models.TextField(_('description'), blank=True) class Meta: verbose_name = _('activity') + verbose_name_plural = _('activities') def __unicode__(self): return ' - '.join((self.person, self.role, self.date_begin, self.date_end)) + + +class PersonLink(Link): + """A person can have many links.""" + + person = models.ForeignKey('Person', verbose_name=_('person')) + + class Meta: + verbose_name = _('person link') + + def __str__(self): + return self.url diff --git a/app/organization/team/translation.py b/app/organization/team/translation.py index f93844cf..8d439fb9 100644 --- a/app/organization/team/translation.py +++ b/app/organization/team/translation.py @@ -26,7 +26,13 @@ class PersonTranslationOptions(TranslationOptions): fields = ('bio',) -@register(Activity) -class ActivityTranslationOptions(TranslationOptions): +@register(PersonActivity) +class PersonActivityTranslationOptions(TranslationOptions): fields = ('description', 'content') + + +@register(PersonLink) +class PersonTranslationOptions(TranslationOptions): + + pass -- 2.39.5