Skip to content

Commit 411d494

Browse files
Merge pull request #1857 from IFRCGo/feature/molnix-1813
Create a MolnixTagGroup model. A MolnixTag can belong to many MolnixTagGroups
2 parents 60a1488 + 91de5d7 commit 411d494

File tree

6 files changed

+88
-4
lines changed

6 files changed

+88
-4
lines changed

api/management/commands/sync_molnix.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from django.conf import settings
66
from api.molnix_utils import MolnixApi
77
from api.logger import logger
8-
from deployments.models import MolnixTag, PersonnelDeployment, Personnel
8+
from deployments.models import MolnixTag, MolnixTagGroup, PersonnelDeployment, Personnel
99
from notifications.models import SurgeAlert, SurgeAlertType, SurgeAlertCategory
1010
from api.models import Event, Country, CronJobStatus
1111
from api.create_cron import create_cron_record
@@ -30,6 +30,7 @@
3030
'ICRC': 'ICRC'
3131
}
3232

33+
3334
def get_unique_tags(deployments, open_positions):
3435
tags = []
3536
tag_ids = []
@@ -41,7 +42,7 @@ def get_unique_tags(deployments, open_positions):
4142
return tags
4243

4344

44-
def add_tags(molnix_tags):
45+
def add_tags(molnix_tags, api):
4546
modality = ['In Person', 'Remote']
4647
region = ['ASIAP', 'AMER', 'AFRICA', 'MENA', 'EURO']
4748
scope = ['REGIONAL', 'GLOBAL']
@@ -52,6 +53,16 @@ def add_tags(molnix_tags):
5253

5354
for molnix_tag in molnix_tags:
5455
tag, created = MolnixTag.objects.get_or_create(molnix_id=molnix_tag['id'])
56+
tag_groups = api.get_tag_groups(molnix_tag['id']) if molnix_tag['id'] else []
57+
for g in tag_groups:
58+
tag_group, created = MolnixTagGroup.objects.get_or_create(
59+
molnix_id=g['id'],
60+
name=g['name'])
61+
if created:
62+
tag_group.created_at = g['created_at']
63+
tag_group.updated_at = g['updated_at']
64+
tag_group.save()
65+
tag.groups.add(tag_group)
5566
tag.molnix_id = molnix_tag['id']
5667
tag.name = n = molnix_tag['name']
5768
tag.description = molnix_tag['description']
@@ -388,7 +399,7 @@ def handle(self, *args, **options):
388399

389400
try:
390401
used_tags = get_unique_tags(deployments, open_positions)
391-
add_tags(used_tags)
402+
add_tags(used_tags, molnix) # FIXME 2nd arg: a workaround to be able to get the group details inside.
392403
positions_messages, positions_warnings, positions_created = sync_open_positions(open_positions, molnix, countries)
393404
deployments_messages, deployments_warnings, deployments_created = sync_deployments(deployments, molnix, countries)
394405
except Exception as ex:

api/molnix_utils.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ def login(self):
5555
def get_tags(self):
5656
return self.call_api(path='tags')['tags']
5757

58+
def get_tag_groups(self, id):
59+
return self.call_api(path='tags/edit/%d' % id)['tag']['groups']
60+
5861
def get_open_positions(self):
5962
#return self.call_api_paginated(path='positions', response_key='positions')
6063
return self.call_api(path='positions/open')

deployments/admin.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ class SectorTagAdmin(CompareVersionAdmin, admin.ModelAdmin):
4646
search_fields = ('title',)
4747

4848

49+
class MolnixTagGroupAdmin(CompareVersionAdmin, admin.ModelAdmin):
50+
model = models.MolnixTagGroup
51+
list_display = ['name', 'molnix_id']
52+
ordering = ('molnix_id',)
53+
search_fields = ('name',)
54+
55+
4956
@admin.register(models.ERU)
5057
class ERUAdmin(CompareVersionAdmin, admin.ModelAdmin):
5158
search_fields = ('national_society_country__name',)
@@ -315,3 +322,4 @@ class EmergencyProjectAdmin(CompareVersionAdmin, admin.ModelAdmin):
315322
admin.site.register(models.ERUReadiness, ERUReadinessAdmin)
316323
admin.site.register(models.Sector, SectorAdmin)
317324
admin.site.register(models.SectorTag, SectorTagAdmin)
325+
admin.site.register(models.MolnixTagGroup, MolnixTagGroupAdmin)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Generated by Django 3.2.20 on 2023-07-27 08:53
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('deployments', '0082_personnel_surge_alert'),
10+
]
11+
12+
operations = [
13+
migrations.CreateModel(
14+
name='MolnixTagGroup',
15+
fields=[
16+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
17+
('molnix_id', models.IntegerField()),
18+
('name', models.CharField(max_length=255, verbose_name='name')),
19+
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')),
20+
('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')),
21+
('is_deprecated', models.BooleanField(default=False, help_text='Is this a deprecated group?')),
22+
],
23+
options={
24+
'verbose_name': 'Molnix Tag Group',
25+
'verbose_name_plural': 'Molnix Tag Groups',
26+
},
27+
),
28+
migrations.AddField(
29+
model_name='molnixtag',
30+
name='groups',
31+
field=models.ManyToManyField(blank=True, related_name='groups', to='deployments.MolnixTagGroup'),
32+
),
33+
]

deployments/models.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,22 @@ def __str__(self):
157157
return "%s, %s" % (self.country_deployed_to, self.region_deployed_to)
158158

159159

160+
@reversion.register()
161+
class MolnixTagGroup(models.Model):
162+
molnix_id = models.IntegerField()
163+
name = models.CharField(max_length=255, verbose_name=_("name"))
164+
created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True)
165+
updated_at = models.DateTimeField(verbose_name=_("updated at"), auto_now=True)
166+
is_deprecated = models.BooleanField(default=False, help_text=_("Is this a deprecated group?"))
167+
168+
class Meta:
169+
verbose_name = _("Molnix Tag Group")
170+
verbose_name_plural = _("Molnix Tag Groups")
171+
172+
def __str__(self):
173+
return self.name
174+
175+
160176
@reversion.register()
161177
class MolnixTag(models.Model):
162178
"""
@@ -170,6 +186,11 @@ class MolnixTag(models.Model):
170186
color = models.CharField(max_length=6)
171187
tag_type = models.CharField(max_length=127)
172188
tag_category = models.CharField(null=True, max_length=127)
189+
groups = models.ManyToManyField(
190+
MolnixTagGroup,
191+
related_name="groups",
192+
blank=True,
193+
)
173194

174195
def __str__(self):
175196
return self.name

deployments/serializers.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
ERU,
3030
PersonnelDeployment,
3131
MolnixTag,
32+
MolnixTagGroup,
3233
Personnel,
3334
PartnerSocietyActivities,
3435
PartnerSocietyDeployment,
@@ -117,11 +118,18 @@ class Meta:
117118

118119

119120
class MolnixTagSerializer(ModelSerializer):
121+
groups = serializers.SerializerMethodField()
120122

121123
class Meta:
122-
fields = ('id', 'molnix_id', 'name', 'description', 'color', 'tag_type')
124+
fields = ('id', 'molnix_id', 'name', 'description', 'color', 'tag_type', 'groups')
123125
model = MolnixTag
124126

127+
@staticmethod
128+
def get_groups(obj):
129+
return [t.name for t in obj.groups.all() if not t.is_deprecated]
130+
# or a detailed response, if needed:
131+
# return [{"molnix_id": t.molnix_id, "name": t.name} for t in obj.groups.all() if not t.is_deprecated]
132+
125133

126134
class PersonnelDeploymentCsvSerializer(ModelSerializer):
127135
event_deployed_to = SmallEventForPersonnelCsvSerializer()

0 commit comments

Comments
 (0)