Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions rdmo/core/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -466,6 +466,9 @@
[\d\s]*$ # Main number with spaces
''', re.VERBOSE)


PROJECT_FIELDS = {}

DEFAULT_URI_PREFIX = 'http://example.com/terms'

REPLACE_MISSING_TRANSLATION = False
Expand Down
8 changes: 7 additions & 1 deletion rdmo/projects/serializers/v1/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,12 @@ def get_queryset(self):

visibility = serializers.CharField(source='visibility.get_help_display', read_only=True)

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

for field in settings.PROJECT_FIELDS:
self.fields[field] = serializers.CharField(read_only=True)

class Meta:
model = Project
fields = (
Expand All @@ -166,7 +172,7 @@ class Meta:
'progress_total',
'progress_count',
'visibility',
'permissions',
'permissions'
)
read_only_fields = (
'snapshots',
Expand Down
18 changes: 17 additions & 1 deletion rdmo/projects/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,12 +154,28 @@ def get_queryset(self):
last_changed_subquery = Subquery(
Value.objects.filter(project=OuterRef('pk')).order_by('-updated').values('updated')[:1]
)

extra_subqueries = {}
if settings.PROJECT_FIELDS:
questions = {
question.uri: question
for question in Question.objects.filter(uri__in=settings.PROJECT_FIELDS.values())
}
extra_subqueries.update({
field: Subquery(
Value.objects.filter(project=OuterRef('pk'), snapshot=None, attribute=questions[uri].attribute)
.values('text')[:1]
)
for field, uri in settings.PROJECT_FIELDS.items()
})

# the 'updated' field from a Project always returns a valid DateTime value
# when Greatest returns null, then Coalesce will return the value for 'updated' as a fall-back
# when Greatest returns a value, then Coalesce will return this value
queryset = queryset.annotate(
current_role=membership_subquery,
last_changed=Coalesce(Greatest(last_changed_subquery, 'updated'), 'updated')
last_changed=Coalesce(Greatest(last_changed_subquery, 'updated'), 'updated'),
**extra_subqueries
)

# cache queryset and return
Expand Down