Skip to content

Commit f7e69c9

Browse files
Merge pull request #1741 from IFRCGo/develop
Release 1.1.473
2 parents c76130b + 9918d55 commit f7e69c9

File tree

197 files changed

+3580
-942
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

197 files changed

+3580
-942
lines changed

.dockerignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
11
.db/
2+
.mypy_cache/
3+
.pytest_cache/
4+
go-logs/
5+
media/
6+
go.log

CHANGELOG.md

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,19 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
66

77
## Unreleased
88

9+
## 1.1.473
10+
11+
### Added
12+
- Django_haystack based, full page search
13+
- Sector and SectorTag not hardwired
14+
- Bump up modules (redis), snapshot test fixes
15+
16+
## 1.1.472
917
## 1.1.471
1018

1119
### Added
12-
- Hotfix for DREF permissions
20+
- Hotfix for DREF: image fields
21+
- Hotfix for DREF: permissions
1322

1423
## 1.1.470
1524

@@ -2163,7 +2172,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
21632172

21642173
## 0.1.20
21652174

2166-
[Unreleased]: https://github.com/IFRCGo/go-api/compare/1.1.471...HEAD
2175+
[Unreleased]: https://github.com/IFRCGo/go-api/compare/1.1.473...HEAD
2176+
[1.1.473]: https://github.com/IFRCGo/go-api/compare/1.1.472...1.1.473
2177+
[1.1.472]: https://github.com/IFRCGo/go-api/compare/1.1.471...1.1.472
21672178
[1.1.471]: https://github.com/IFRCGo/go-api/compare/1.1.470...1.1.471
21682179
[1.1.470]: https://github.com/IFRCGo/go-api/compare/1.1.469...1.1.470
21692180
[1.1.469]: https://github.com/IFRCGo/go-api/compare/1.1.468...1.1.469

README.md

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,13 +177,27 @@ set. Check the script for the specific variables in your environment.
177177
## Deployment command
178178
179179
```(bash)
180-
docker run -p 80:80 --env-file .env -d -t ifrcgo/go-api:{TAG_NUMBER}
180+
docker-compose up serve celery
181+
```
182+
or (just the base serve command):
183+
```(bash)
184+
docker-compose run --rm --service-ports serve
181185
```
182-
183186
## Comment for loading data
184187

185188
In `main/runserver.sh` the line containing the `loaddata` command is only necessary when creating a new database. In other cases it might be causing the conflict, so it is commented.
186189

190+
## Initializing ElasticSearch
191+
192+
For the initial creation of an index
193+
```(bash)
194+
docker-compose exec serve bash python manage.py rebuild_index
195+
```
196+
For updating the index
197+
```(bash)
198+
docker-compose exec serve bash python manage.py update_index
199+
```
200+
187201
# Management commands to update and import admin0 and admin1 data
188202

189203
There are two Django management commands that helps to work with ICRC admin0 and admin1 shapefiles. These commands should be used only when you want to update geometries, or import new ones from a shapefile. The structure of the shapefile is not very flexible, but can be adjusted easily in the scripts.

api/drf_views.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,14 +131,15 @@
131131

132132
class DeploymentsByEventViewset(viewsets.ReadOnlyModelViewSet):
133133
serializer_class = DeploymentsByEventSerializer
134+
today = timezone.now().date().strftime("%Y-%m-%d")
134135
queryset = Event.objects.prefetch_related('personneldeployment_set__personnel_set__country_from') \
135136
.annotate(
136137
personnel_count=Count(
137138
'personneldeployment__personnel',
138139
filter=Q(
139140
personneldeployment__personnel__type=Personnel.TypeChoices.RR,
140-
personneldeployment__personnel__start_date__lte=timezone.now(),
141-
personneldeployment__personnel__end_date__gte=timezone.now(),
141+
personneldeployment__personnel__start_date__date__lte=today,
142+
personneldeployment__personnel__end_date__date__gte=today,
142143
personneldeployment__personnel__is_active=True
143144
)
144145
)
@@ -151,9 +152,10 @@ class EventDeploymentsViewset(viewsets.ReadOnlyModelViewSet):
151152
serializer_class = ListEventDeploymentsSerializer
152153

153154
def get_queryset(self):
155+
today = timezone.now().date().strftime("%Y-%m-%d")
154156
return Personnel.objects.filter(
155-
start_date__lte=timezone.now(),
156-
end_date__gte=timezone.now(),
157+
start_date__date__lte=today,
158+
end_date__date__gte=today,
157159
is_active=True
158160
).order_by().values(
159161
'deployment__event_deployed_to', 'type',

api/management/commands/sync_molnix.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ def add_tags(molnix_tags):
5555
tag.molnix_id = molnix_tag['id']
5656
tag.name = n = molnix_tag['name']
5757
tag.description = molnix_tag['description']
58+
if tag.description is None:
59+
tag.description = ''
60+
logger.warning('%s named tag has no description.' % tag.name)
5861
tag.tag_type = molnix_tag['type']
5962
tag.tag_category = 'molnix_language' if n.startswith('L-') else \
6063
'molnix_operation' if n.startswith('OP-') else \
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Generated by Django 3.2.18 on 2023-03-31 11:42
2+
3+
from django.db import migrations, models
4+
import django.utils.timezone
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('api', '0161_alter_event_options'),
11+
]
12+
13+
operations = [
14+
migrations.AddField(
15+
model_name='admin2',
16+
name='created_at',
17+
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='Created at'),
18+
preserve_default=False,
19+
),
20+
]

api/models.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ class Admin2(models.Model):
273273
local_name_code = models.CharField(verbose_name=_('Local Name Language Code'), max_length=10, blank=True, null=True)
274274
alternate_name = models.CharField(verbose_name=_('Alternate Name'), max_length=100, blank=True, null=True)
275275
alternate_name_code = models.CharField(verbose_name=_('Alternate Name Language Code'), max_length=10, blank=True, null=True)
276-
276+
created_at = models.DateTimeField(verbose_name=_('Created at'), auto_now_add=True)
277277

278278
class Meta:
279279
verbose_name = _('admin2')
@@ -365,7 +365,7 @@ class TabNumber(models.IntegerChoices):
365365
TAB_3 = 3, _('Tab 3')
366366

367367

368-
@reversion.register()
368+
@reversion.register(follow=('region',))
369369
class RegionSnippet(models.Model):
370370
region = models.ForeignKey(Region, verbose_name=_('region'), related_name='snippets', on_delete=models.CASCADE)
371371
snippet = HTMLField(verbose_name=_('snippet'), null=True, blank=True)
@@ -382,7 +382,7 @@ def __str__(self):
382382
return self.snippet
383383

384384

385-
@reversion.register()
385+
@reversion.register(follow=('region',))
386386
class RegionEmergencySnippet(models.Model):
387387
region = models.ForeignKey(Region, verbose_name=_('region'), related_name='emergency_snippets', on_delete=models.CASCADE)
388388
title = models.CharField(max_length=255, blank=True)
@@ -399,7 +399,7 @@ def __str__(self):
399399
return self.snippet
400400

401401

402-
@reversion.register()
402+
@reversion.register(follow=('region',))
403403
class RegionPreparednessSnippet(models.Model):
404404
region = models.ForeignKey(Region, verbose_name=_('region'), related_name='preparedness_snippets', on_delete=models.CASCADE)
405405
title = models.CharField(max_length=255, blank=True)
@@ -416,7 +416,7 @@ def __str__(self):
416416
return self.snippet
417417

418418

419-
@reversion.register()
419+
@reversion.register(follow=('region',))
420420
class RegionProfileSnippet(models.Model):
421421
region = models.ForeignKey(Region, verbose_name=_('region'), related_name='profile_snippets', on_delete=models.CASCADE)
422422
title = models.CharField(max_length=255, blank=True)
@@ -442,7 +442,7 @@ def __str__(self):
442442
# return self.title
443443

444444

445-
@reversion.register()
445+
@reversion.register(follow=('country',))
446446
class CountrySnippet(models.Model):
447447
country = models.ForeignKey(Country, verbose_name=_('country'), related_name='snippets', on_delete=models.CASCADE)
448448
snippet = HTMLField(verbose_name=_('snippet'), null=True, blank=True)
@@ -736,7 +736,7 @@ class Meta:
736736
ordering = ('id',)
737737

738738

739-
@reversion.register()
739+
@reversion.register(follow=('event',))
740740
class Snippet(models.Model):
741741
""" Snippet of text """
742742
snippet = HTMLField(verbose_name=_('snippet'), null=True, blank=True)

api/receivers.py

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import json
2+
from datetime import datetime
23
from dateutil.relativedelta import relativedelta
4+
35
from django.db import transaction
46
from django.db.models import Q
57
from django.db.models.signals import pre_delete, pre_save, post_save, post_delete
68
from django.dispatch import receiver
9+
from django.utils import timezone
10+
711
from reversion.models import Version
812
from reversion.signals import post_revision_commit
913
from api.models import ReversionDifferenceLog, Event, Country, FieldReport
@@ -12,8 +16,7 @@
1216
from utils.erp import push_fr_data
1317
from api.logger import logger
1418
from .models import Appeal, AppealHistory, AppealFilter
15-
from django.utils import timezone
16-
from datetime import datetime, timedelta
19+
from main.suspend_receivers import suspendingreceiver
1720

1821

1922
MODEL_TYPES = {
@@ -136,7 +139,8 @@ def log_deletion(sender, instance, using, **kwargs):
136139
delete_es_index(instance)
137140

138141

139-
@receiver(pre_save)
142+
# NOTE: Adding this to disable indexing in testcases
143+
@suspendingreceiver(pre_save)
140144
def remove_child_events_from_es(sender, instance, using, **kwargs):
141145
''' Handle Emergency Elasticsearch indexes '''
142146
model = instance.__class__.__name__
@@ -202,7 +206,6 @@ def add_update_appeal_history(sender, instance, created, **kwargs):
202206
if field.name not in ['id', 'appeal', 'valid_from', 'valid_to','aid','amount_funded']
203207
]
204208
now = timezone.now()
205-
valid_to = timezone.now() + relativedelta(years=+10)
206209
changed = False
207210

208211
if created: # Appeal Insert
@@ -220,12 +223,12 @@ def add_update_appeal_history(sender, instance, created, **kwargs):
220223
atype=instance.atype,
221224
country=instance.country,
222225
region=instance.region,
223-
dtype = instance.dtype,
224-
needs_confirmation = instance.needs_confirmation,
225-
status = instance.status,
226-
code = instance.code,
227-
triggering_amount = instance.triggering_amount
228-
#deleted_at = instance.deleted_at
226+
dtype=instance.dtype,
227+
needs_confirmation=instance.needs_confirmation,
228+
status=instance.status,
229+
code=instance.code,
230+
triggering_amount=instance.triggering_amount
231+
# deleted_at = instance.deleted_at
229232
)
230233

231234
else: # Appeal Update
@@ -258,22 +261,22 @@ def add_update_appeal_history(sender, instance, created, **kwargs):
258261
atype=instance.atype,
259262
country=instance.country,
260263
region=instance.region,
261-
dtype = instance.dtype,
262-
needs_confirmation = instance.needs_confirmation,
263-
status = instance.status,
264-
code = instance.code,
265-
triggering_amount = instance.triggering_amount
266-
#deleted_at = instance.deleted_at
264+
dtype=instance.dtype,
265+
needs_confirmation=instance.needs_confirmation,
266+
status=instance.status,
267+
code=instance.code,
268+
triggering_amount=instance.triggering_amount
269+
# deleted_at = instance.deleted_at
267270
)
268271

269272

270273
@receiver(post_delete, sender=Appeal)
271274
def remove_appeal_filter(sender, instance, using, **kwargs):
272275
appealFilter = AppealFilter.objects.get(name='ingestAppealFilter')
273276
lstCodesToSkip = appealFilter.value.split(",")
274-
if instance.code not in lstCodesToSkip:
275-
lstCodesToSkip.append(instance.code)
277+
if instance.code not in lstCodesToSkip:
278+
lstCodesToSkip.append(instance.code)
276279

277280
appealFilter.value = ",".join(lstCodesToSkip)
278-
#appealFilter.value = ",".join(appealFilter.value.split(",").remove(self.code))
279-
appealFilter.save()
281+
# appealFilter.value = ",".join(appealFilter.value.split(",").remove(self.code))
282+
appealFilter.save()

0 commit comments

Comments
 (0)