From: Guillaume Pellerin Date: Fri, 15 Jul 2016 16:07:19 +0000 (+0200) Subject: add nationalities and first project context X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=9d549f1b52fbb5bdb0f7448eac3aedbe2aee9119;p=mezzo.git add nationalities and first project context --- diff --git a/app/organization/project/migrations/0002_auto_20160715_1807.py b/app/organization/project/migrations/0002_auto_20160715_1807.py new file mode 100644 index 00000000..c1f563ed --- /dev/null +++ b/app/organization/project/migrations/0002_auto_20160715_1807.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-15 16:07 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-team', '0004_auto_20160715_1807'), + ('organization-project', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='project', + name='partners', + ), + migrations.RemoveField( + model_name='project', + name='persons', + ), + migrations.AddField( + model_name='project', + name='leader_team', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='project_leader', to='organization-team.Team', verbose_name='lead team'), + ), + migrations.AddField( + model_name='project', + name='partner_organizations', + field=models.ManyToManyField(blank=True, to='organization-team.Organization', verbose_name='partner organizations'), + ), + migrations.AddField( + model_name='project', + name='partner_persons', + field=models.ManyToManyField(blank=True, to='organization-team.Person', verbose_name='partner persons'), + ), + migrations.AddField( + model_name='project', + name='partner_teams', + field=models.ManyToManyField(blank=True, related_name='project_partners', to='organization-team.Team', verbose_name='partner teams'), + ), + ] diff --git a/app/organization/project/models.py b/app/organization/project/models.py index 31a7792d..21ede98b 100644 --- a/app/organization/project/models.py +++ b/app/organization/project/models.py @@ -5,14 +5,16 @@ from django.utils.translation import ugettext_lazy as _ from mezzanine.core.models import RichText, Displayable, Slugged -from organization.team.models import Person, Organization +from organization.team.models import Person, Team, Organization class Project(Displayable, RichText): """(Project description)""" - persons = models.ManyToManyField(Person, verbose_name=_('persons')) - partners = models.ManyToManyField(Organization, verbose_name=_('organizations')) + leader_team = models.ForeignKey(Team, verbose_name=_('lead team'), related_name='project_leader', blank=True, null=True) + 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) def __unicode__(self): return self.title diff --git a/app/organization/team/migrations/0004_auto_20160715_1807.py b/app/organization/team/migrations/0004_auto_20160715_1807.py new file mode 100644 index 00000000..1150a2d8 --- /dev/null +++ b/app/organization/team/migrations/0004_auto_20160715_1807.py @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-15 16:07 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import mezzanine.core.fields +import organization.team.nationalities.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-team', '0003_auto_20160714_1943'), + ] + + operations = [ + migrations.DeleteModel( + name='Nationality', + ), + migrations.AlterModelOptions( + name='activity', + options={'verbose_name': 'activity'}, + ), + migrations.AlterModelOptions( + name='link', + options={'verbose_name': 'link'}, + ), + migrations.AlterModelOptions( + name='team', + options={'verbose_name': 'team'}, + ), + migrations.AddField( + model_name='organization', + name='photo', + field=mezzanine.core.fields.FileField(blank=True, max_length=1024, verbose_name='photo'), + ), + migrations.AddField( + model_name='organization', + name='photo_alignment', + field=models.CharField(blank=True, choices=[('left', 'left'), ('center', 'center'), ('right', 'right')], default='left', max_length=32, verbose_name='photo alignment'), + ), + migrations.AddField( + model_name='organization', + name='photo_card', + field=mezzanine.core.fields.FileField(blank=True, max_length=1024, verbose_name='card photo'), + ), + migrations.AddField( + model_name='organization', + name='photo_card_credits', + field=models.CharField(blank=True, max_length=255, null=True, verbose_name='photo card credits'), + ), + migrations.AddField( + model_name='organization', + name='photo_credits', + field=models.CharField(blank=True, max_length=255, null=True, verbose_name='photo credits'), + ), + migrations.AddField( + model_name='organization', + name='photo_description', + field=models.TextField(blank=True, verbose_name='photo description'), + ), + migrations.AddField( + model_name='organization', + name='photo_slider', + field=mezzanine.core.fields.FileField(blank=True, max_length=1024, verbose_name='slider photo'), + ), + migrations.AddField( + model_name='organization', + name='photo_slider_credits', + field=models.CharField(blank=True, max_length=255, null=True, verbose_name='photo slider credits'), + ), + migrations.AddField( + model_name='person', + name='nationality', + field=organization.team.nationalities.fields.NationalityField(blank=True, choices=[('AF', 'Afghan'), ('AL', 'Albanian'), ('DZ', 'Algerian'), ('AD', 'Andorran'), ('AO', 'Angolan'), ('AR', 'Argentinian'), ('AM', 'Armenian'), ('AU', 'Australian'), ('AT', 'Austrian'), ('AZ', 'Azerbaijani'), ('BS', 'Bahamian'), ('BH', 'Bahraini'), ('BD', 'Bangladeshi'), ('BB', 'Barbadian'), ('BY', 'Belorussian'), ('BE', 'Belgian'), ('BZ', 'Belizian'), ('BJ', 'Beninese'), ('BT', 'Bhutanese'), ('BO', 'Bolivian'), ('BA', 'Bosnian'), ('BW', 'Botswanan'), ('BR', 'Brazilian'), ('GB', 'British'), ('BN', 'Bruneian'), ('BG', 'Bulgarian'), ('BF', 'Burkinese'), ('MM', 'Burmese'), ('BF', 'Burundian'), ('BI', 'Cambodian'), ('CM', 'Cameroonian'), ('CA', 'Canadian'), ('CV', 'Cape Verdean'), ('TD', 'Chadian'), ('CL', 'Chilean'), ('CN', 'Chinese'), ('CO', 'Colombian'), ('CG', 'Congolese'), ('CR', 'Costa Rican'), ('HR', 'Croatian'), ('CU', 'Cuban'), ('CY', 'Cypriot'), ('CZ', 'Czech'), ('DK', 'Danish'), ('DJ', 'Djiboutian'), ('DM', 'Dominican'), ('DO', 'Dominican'), ('EC', 'Ecuadorean'), ('EG', 'Egyptian'), ('SV', 'Salvadorean'), ('GB', 'English'), ('ER', 'Eritrean'), ('EE', 'Estonian'), ('ET', 'Ethiopian'), ('FJ', 'Fijian'), ('FI', 'Finnish'), ('FR', 'French'), ('GA', 'Gabonese'), ('GM', 'Gambian'), ('GE', 'Georgian'), ('DE', 'German'), ('GH', 'Ghanaian'), ('GR', 'Greek'), ('GD', 'Grenadian'), ('GT', 'Guatemalan'), ('GQ', 'Guinean'), ('GY', 'Guyanese'), ('HT', 'Haitian'), ('NL', 'Dutch'), ('HN', 'Honduran'), ('HU', 'Hungarian'), ('IS', 'Icelandic'), ('IO', 'Indian'), ('ID', 'Indonesian'), ('IR', 'Iranian'), ('IQ', 'Iraqi'), ('IE', 'Irish'), ('IL', 'Israeli'), ('IT', 'Italian'), ('JM', 'Jamaican'), ('JP', 'Japanese'), ('JO', 'Jordanian'), ('KZ', 'Kazakh'), ('KE', 'Kenyan'), ('KW', 'Kuwaiti'), ('LA', 'Laotian'), ('LV', 'Latvian'), ('LB', 'Lebanese'), ('LR', 'Liberian'), ('LY', 'Libyan'), ('LT', 'Lithuanian'), ('MK', 'Macedonian'), ('MG', 'Malagasay'), ('MW', 'Malawian'), ('MY', 'Malaysian'), ('MV', 'Maldivian'), ('ML', 'Malian'), ('MT', 'Maltese'), ('MR', 'Mauritanian'), ('MU', 'Mauritian'), ('MX', 'Mexican'), ('MD', 'Moldovan'), ('MC', 'Monacan'), ('MN', 'Mongolian'), ('ME', 'Montenegrin'), ('MA', 'Moroccan'), ('MZ', 'Mozambican'), ('NA', 'Namibian'), ('NP', 'Nepalese'), ('NI', 'Nicaraguan'), ('NE', 'Nigerien'), ('NG', 'Nigerian'), ('KP', 'North Korean'), ('NO', 'Norwegian'), ('OM', 'Omani'), ('PK', 'Pakistani'), ('PA', 'Panamanian'), ('PG', 'Guinean'), ('PY', 'Paraguayan'), ('PE', 'Peruvian'), ('PH', 'Philippine'), ('PL', 'Polish'), ('PT', 'Portuguese'), ('QA', 'Qatari'), ('RO', 'Romanian'), ('RU', 'Russian'), ('RW', 'Rwandan'), ('SA', 'Saudi'), ('AE', 'Scottish'), ('SN', 'Senegalese'), ('RS', 'Serbian'), ('SC', 'Seychellois'), ('SL', 'Sierra Leonian'), ('SG', 'Singaporean'), ('SK', 'Slovak'), ('SI', 'Slovenian'), ('SO', 'Somali'), ('ZA', 'South African'), ('KR', 'South Korean'), ('ES', 'Spanish'), ('LK', 'Sri Lankan'), ('SD', 'Sudanese'), ('SR', 'Surinamese'), ('SZ', 'Swazi'), ('SE', 'Swedish'), ('CH', 'Swiss'), ('SY', 'Syrian'), ('TW', 'Taiwanese'), ('TJ', 'Tadjik'), ('TZ', 'Tanzanian'), ('TH', 'Thai'), ('TG', 'Togolese'), ('TT', 'Trinidadian'), ('TN', 'Tunisian'), ('TR', 'Turkish'), ('TM', 'Turkmen'), ('TV', 'Tuvaluan'), ('UG', 'Ugandan'), ('UA', 'Ukrainian'), ('UY', 'Uruguayan'), ('UZ', 'Uzbek'), ('VU', 'Vanuatuan'), ('VE', 'Venezuelan'), ('VN', 'Vietnamese'), ('GB', 'Welsh'), ('YE', 'Yemeni'), ('ZM', 'Zambian'), ('ZW', 'Zimbabwean')], max_length=2, verbose_name='nationality'), + ), + migrations.AddField( + model_name='team', + name='partner_organizations', + field=models.ManyToManyField(blank=True, to='organization-team.Organization', verbose_name='partner organizations'), + ), + migrations.AddField( + model_name='team', + name='partner_teams', + field=models.ManyToManyField(blank=True, to='organization-team.Team', verbose_name='partner teams'), + ), + migrations.AlterField( + model_name='activity', + name='description', + field=models.TextField(blank=True, verbose_name='description'), + ), + migrations.AlterField( + model_name='activity', + name='description_en', + field=models.TextField(blank=True, null=True, verbose_name='description'), + ), + migrations.AlterField( + model_name='activity', + name='description_fr', + field=models.TextField(blank=True, null=True, verbose_name='description'), + ), + migrations.AlterField( + model_name='link', + name='link_type', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organization-team.LinkType', verbose_name='link type'), + ), + migrations.AlterField( + model_name='link', + name='person', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organization-team.Person', verbose_name='person'), + ), + migrations.AlterField( + model_name='linktype', + name='name', + field=models.CharField(max_length=256, verbose_name='name'), + ), + migrations.AlterField( + model_name='linktype', + name='ordering', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='ordering'), + ), + migrations.AlterField( + model_name='linktype', + name='slug', + field=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'), + ), + ] diff --git a/app/organization/team/models.py b/app/organization/team/models.py index 99289b0d..74d92066 100644 --- a/app/organization/team/models.py +++ b/app/organization/team/models.py @@ -19,11 +19,13 @@ from mezzanine.core.models import RichText, Displayable, Slugged from mezzanine.core.fields import RichTextField, OrderField, FileField from mezzanine.utils.models import AdminThumbMixin, upload_to -from django_countries.fields import CountryField - from organization.media.models import Photo from organization.core.models import Named +from django_countries.fields import CountryField +from .nationalities.fields import NationalityField + + # Hack to have these strings translated mr = _('Mr') mrs = _('Ms') @@ -57,7 +59,7 @@ class Address(models.Model): abstract = True -class Organization(Named, Address): +class Organization(Named, Address, Photo): """(Organization description)""" type = models.ForeignKey('OrganizationType', verbose_name=_('organization type'), blank=True, null=True, on_delete=models.SET_NULL) @@ -95,6 +97,8 @@ class Team(Named): """(Team description)""" department = models.ForeignKey('Department', verbose_name=_('department'), blank=True, null=True, on_delete=models.SET_NULL) + partner_organizations = models.ManyToManyField(Organization, verbose_name=_('partner organizations'), blank=True) + partner_teams = models.ManyToManyField('Team', verbose_name=_('partner teams'), blank=True) class Meta: verbose_name = _('team') @@ -112,6 +116,7 @@ class Person(AdminThumbMixin, Photo): first_name = models.CharField(_('first name'), max_length=255, blank=True, null=True) last_name = models.CharField(_('last name'), max_length=255, blank=True, null=True) birthday = models.DateField(_('birthday'), blank=True) + nationality = NationalityField(_('nationality'), blank=True) bio = RichTextField(_('biography'), blank=True) organization = models.ForeignKey('Organization', verbose_name=_('organization'), blank=True, null=True, on_delete=models.SET_NULL) @@ -146,18 +151,6 @@ class Person(AdminThumbMixin, Photo): super(Person, self).save(*args, **kwargs) -class Nationality(models.Model): - """(Nationality description)""" - - name = models.CharField(_('name'), max_length=128) - - class Meta: - verbose_name = _('nationality') - - def __unicode__(self): - return self.name - - class Link(models.Model): """A person can have many links.""" diff --git a/app/organization/team/nationalities/__init__.py b/app/organization/team/nationalities/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/organization/team/nationalities/fields.py b/app/organization/team/nationalities/fields.py new file mode 100644 index 00000000..f9a71a3a --- /dev/null +++ b/app/organization/team/nationalities/fields.py @@ -0,0 +1,118 @@ +from django.db.models.fields import CharField + + +class Nationality(object): + """ + Class represents a nationality. + + >>> hungarian = Nationality('HU') + >>> hungarian.code + u'HU' + >>> hungarian.name + u'Hungarian' + + """ + + def __init__(self, code): + """ + Constructor accepts ISO 3166-1 country code. + """ + self.code = code + + def __unicode__(self): + return unicode(self.code or '') + + def __eq__(self, other): + return self.code == unicode(other) + + def __ne__(self, other): + return not self.__eq__(other) + + def __cmp__(self, other): + return cmp(self.code, unicode(other)) + + def __hash__(self): + return hash(self.code) + + @property + def name(self): + """ + Return verbose name of nationality. + """ + from .nationalities import NATIONALITIES + for code, name in NATIONALITIES: + if self.code == code: + return name + return None + + +class NationalityDescriptor(object): + """ + A descriptor for nationality fields on model instances. Returns a + Nationality when accessed. + + >>> instance.nationality.name + u'Hungarian' + + """ + + def __init__(self, field): + self.field = field + + def __get__(self, instance=None, owner=None): + if instance is None: + raise AttributeError( + "The '%s' attribute can only be accessed from %s instances." + % (self.field.name, owner.__name__)) + return Nationality(code=instance.__dict__[self.field.name]) + + def __set__(self, instance, value): + instance.__dict__[self.field.name] = unicode(value) + + +class NationalityField(CharField): + """ + A nationality field for Django models that provides all nationalities as + choices. + """ + + descriptor_class = NationalityDescriptor + + def __init__(self, *args, **kwargs): + from .nationalities import NATIONALITIES + kwargs.setdefault('max_length', 2) + kwargs.setdefault('choices', NATIONALITIES) + super(CharField, self).__init__(*args, **kwargs) + + def get_internal_type(self): + return 'CharField' + + def contribute_to_class(self, cls, name): + super(NationalityField, self).contribute_to_class(cls, name) + setattr(cls, self.name, self.descriptor_class(self)) + + def get_prep_lookup(self, lookup_type, value): + if hasattr(value, 'code'): + value = value.code + return super(NationalityField, self).get_prep_lookup(lookup_type, value) + + def pre_save(self, *args, **kwargs): + "Returns field's value just before saving." + value = super(CharField, self).pre_save(*args, **kwargs) + return self.get_prep_value(value) + + def get_prep_value(self, value): + "Returns field's value prepared for saving into a database." + # Convert the Nationality to unicode for database insertion. + if value is None: + return None + return unicode(value) + + +# If south is installed, ensure that NationalityField will be introspected just +# like a normal CharField. +try: + from south.modelsinspector import add_introspection_rules + add_introspection_rules([], ["^nationalities\.fields\.NationalityField"]) +except ImportError: + pass diff --git a/app/organization/team/nationalities/nationalities.py b/app/organization/team/nationalities/nationalities.py new file mode 100644 index 00000000..06a22887 --- /dev/null +++ b/app/organization/team/nationalities/nationalities.py @@ -0,0 +1,174 @@ +from django.utils.translation import ugettext_lazy as _ + + +# source: http://www.englishclub.com/vocabulary/world-countries-nationality.htm +NATIONALITIES = ( + ('AF', _(u'Afghan')), + ('AL', _(u'Albanian')), + ('DZ', _(u'Algerian')), + ('AD', _(u'Andorran')), + ('AO', _(u'Angolan')), + ('AR', _(u'Argentinian')), + ('AM', _(u'Armenian')), + ('AU', _(u'Australian')), + ('AT', _(u'Austrian')), + ('AZ', _(u'Azerbaijani')), + ('BS', _(u'Bahamian')), + ('BH', _(u'Bahraini')), + ('BD', _(u'Bangladeshi')), + ('BB', _(u'Barbadian')), + ('BY', _(u'Belorussian')), + ('BE', _(u'Belgian')), + ('BZ', _(u'Belizian')), + ('BJ', _(u'Beninese')), + ('BT', _(u'Bhutanese')), + ('BO', _(u'Bolivian')), + ('BA', _(u'Bosnian')), + ('BW', _(u'Botswanan')), + ('BR', _(u'Brazilian')), + ('GB', _(u'British')), + ('BN', _(u'Bruneian')), + ('BG', _(u'Bulgarian')), + ('BF', _(u'Burkinese')), + ('MM', _(u'Burmese')), + ('BF', _(u'Burundian')), + ('BI', _(u'Cambodian')), + ('CM', _(u'Cameroonian')), + ('CA', _(u'Canadian')), + ('CV', _(u'Cape Verdean')), + ('TD', _(u'Chadian')), + ('CL', _(u'Chilean')), + ('CN', _(u'Chinese')), + ('CO', _(u'Colombian')), + ('CG', _(u'Congolese')), + ('CR', _(u'Costa Rican')), + ('HR', _(u'Croatian')), + ('CU', _(u'Cuban')), + ('CY', _(u'Cypriot')), + ('CZ', _(u'Czech')), + ('DK', _(u'Danish')), + ('DJ', _(u'Djiboutian')), + ('DM', _(u'Dominican')), + ('DO', _(u'Dominican')), + ('EC', _(u'Ecuadorean')), + ('EG', _(u'Egyptian')), + ('SV', _(u'Salvadorean')), + ('GB', _(u'English')), + ('ER', _(u'Eritrean')), + ('EE', _(u'Estonian')), + ('ET', _(u'Ethiopian')), + ('FJ', _(u'Fijian')), + ('FI', _(u'Finnish')), + ('FR', _(u'French')), + ('GA', _(u'Gabonese')), + ('GM', _(u'Gambian')), + ('GE', _(u'Georgian')), + ('DE', _(u'German')), + ('GH', _(u'Ghanaian')), + ('GR', _(u'Greek')), + ('GD', _(u'Grenadian')), + ('GT', _(u'Guatemalan')), + ('GQ', _(u'Guinean')), + ('GY', _(u'Guyanese')), + ('HT', _(u'Haitian')), + ('NL', _(u'Dutch')), + ('HN', _(u'Honduran')), + ('HU', _(u'Hungarian')), + ('IS', _(u'Icelandic')), + ('IO', _(u'Indian')), + ('ID', _(u'Indonesian')), + ('IR', _(u'Iranian')), + ('IQ', _(u'Iraqi')), + ('IE', _(u'Irish')), + ('IL', _(u'Israeli')), + ('IT', _(u'Italian')), + ('JM', _(u'Jamaican')), + ('JP', _(u'Japanese')), + ('JO', _(u'Jordanian')), + ('KZ', _(u'Kazakh')), + ('KE', _(u'Kenyan')), + ('KW', _(u'Kuwaiti')), + ('LA', _(u'Laotian')), + ('LV', _(u'Latvian')), + ('LB', _(u'Lebanese')), + ('LR', _(u'Liberian')), + ('LY', _(u'Libyan')), + ('LT', _(u'Lithuanian')), + ('MK', _(u'Macedonian')), + ('MG', _(u'Malagasay')), + ('MW', _(u'Malawian')), + ('MY', _(u'Malaysian')), + ('MV', _(u'Maldivian')), + ('ML', _(u'Malian')), + ('MT', _(u'Maltese')), + ('MR', _(u'Mauritanian')), + ('MU', _(u'Mauritian')), + ('MX', _(u'Mexican')), + ('MD', _(u'Moldovan')), + ('MC', _(u'Monacan')), + ('MN', _(u'Mongolian')), + ('ME', _(u'Montenegrin')), + ('MA', _(u'Moroccan')), + ('MZ', _(u'Mozambican')), + ('NA', _(u'Namibian')), + ('NP', _(u'Nepalese')), + ('NI', _(u'Nicaraguan')), + ('NE', _(u'Nigerien')), + ('NG', _(u'Nigerian')), + ('KP', _(u'North Korean')), + ('NO', _(u'Norwegian')), + ('OM', _(u'Omani')), + ('PK', _(u'Pakistani')), + ('PA', _(u'Panamanian')), + ('PG', _(u'Guinean')), + ('PY', _(u'Paraguayan')), + ('PE', _(u'Peruvian')), + ('PH', _(u'Philippine')), + ('PL', _(u'Polish')), + ('PT', _(u'Portuguese')), + ('QA', _(u'Qatari')), + ('RO', _(u'Romanian')), + ('RU', _(u'Russian')), + ('RW', _(u'Rwandan')), + ('SA', _(u'Saudi')), + ('AE', _(u'Scottish')), + ('SN', _(u'Senegalese')), + ('RS', _(u'Serbian')), + ('SC', _(u'Seychellois')), + ('SL', _(u'Sierra Leonian')), + ('SG', _(u'Singaporean')), + ('SK', _(u'Slovak')), + ('SI', _(u'Slovenian')), + ('SO', _(u'Somali')), + ('ZA', _(u'South African')), + ('KR', _(u'South Korean')), + ('ES', _(u'Spanish')), + ('LK', _(u'Sri Lankan')), + ('SD', _(u'Sudanese')), + ('SR', _(u'Surinamese')), + ('SZ', _(u'Swazi')), + ('SE', _(u'Swedish')), + ('CH', _(u'Swiss')), + ('SY', _(u'Syrian')), + ('TW', _(u'Taiwanese')), + ('TJ', _(u'Tadjik')), + ('TZ', _(u'Tanzanian')), + ('TH', _(u'Thai')), + ('TG', _(u'Togolese')), + ('TT', _(u'Trinidadian')), + ('TN', _(u'Tunisian')), + ('TR', _(u'Turkish')), + ('TM', _(u'Turkmen')), + ('TV', _(u'Tuvaluan')), + ('UG', _(u'Ugandan')), + ('UA', _(u'Ukrainian')), + ('UY', _(u'Uruguayan')), + ('UZ', _(u'Uzbek')), + ('VU', _(u'Vanuatuan')), + ('VE', _(u'Venezuelan')), + ('VN', _(u'Vietnamese')), + ('GB', _(u'Welsh')), + ('YE', _(u'Yemeni')), + ('ZM', _(u'Zambian')), + ('ZW', _(u'Zimbabwean')), +) diff --git a/app/organization/team/urls.py b/app/organization/team/urls.py index ace2c073..ee467fca 100644 --- a/app/organization/team/urls.py +++ b/app/organization/team/urls.py @@ -11,5 +11,5 @@ from organization.team.views import * urlpatterns = [ - + ] diff --git a/app/organization/team/views.py b/app/organization/team/views.py index 1eae93eb..3d4649fb 100644 --- a/app/organization/team/views.py +++ b/app/organization/team/views.py @@ -29,6 +29,24 @@ class TeamDetailView(SlugMixin, DetailView): template_name='team/team_detail.html' context_object_name = 'team' + def get_context_data(self, **kwargs): + context = super(TeamListView, self).get_context_data(**kwargs) + partners = [] + + for partner in self.object.partner_organizations: + partners.append(partner) + for partner in self.object.partner_teams: + partners.append(partner) + + for project in team.project_leader.all(): + for partner in project.partner_organizations: + partners.append(partner) + for partner in project.partner_teams: + partners.append(partner) + + context['partners'] = partners + return context + class PersonListView(ListView):