]> git.parisson.com Git - mezzo.git/commitdiff
add nationalities and first project context
authorGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Fri, 15 Jul 2016 16:07:19 +0000 (18:07 +0200)
committerGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Fri, 15 Jul 2016 16:07:19 +0000 (18:07 +0200)
app/organization/project/migrations/0002_auto_20160715_1807.py [new file with mode: 0644]
app/organization/project/models.py
app/organization/team/migrations/0004_auto_20160715_1807.py [new file with mode: 0644]
app/organization/team/models.py
app/organization/team/nationalities/__init__.py [new file with mode: 0644]
app/organization/team/nationalities/fields.py [new file with mode: 0644]
app/organization/team/nationalities/nationalities.py [new file with mode: 0644]
app/organization/team/urls.py
app/organization/team/views.py

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 (file)
index 0000000..c1f563e
--- /dev/null
@@ -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'),
+        ),
+    ]
index 31a7792dc599dd6bd95e2475617ecf8bf9fb526a..21ede98bc1ce107fbc4f77ddf32ebe5cc38a6205 100644 (file)
@@ -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 (file)
index 0000000..1150a2d
--- /dev/null
@@ -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'),
+        ),
+    ]
index 99289b0dc8af573a763c988cb14d259572872e25..74d9206659e9e3e559637b5009ad47a60c6b17bc 100644 (file)
@@ -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 (file)
index 0000000..e69de29
diff --git a/app/organization/team/nationalities/fields.py b/app/organization/team/nationalities/fields.py
new file mode 100644 (file)
index 0000000..f9a71a3
--- /dev/null
@@ -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 (file)
index 0000000..06a2288
--- /dev/null
@@ -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')),
+)
index ace2c073a5ef861a1aa8873b0eb10901b0d13f6a..ee467fca293803801d0a0548f01eebc8c3b10eb9 100644 (file)
@@ -11,5 +11,5 @@ from organization.team.views import *
 
 
 urlpatterns = [
-
+    
 ]
index 1eae93eb327ec956554d075c18a3877f475802f3..3d4649fb9ec05d520f807c58bb680841c36531b5 100644 (file)
@@ -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):