From e43033822921baadfa4dabac0d6a85e2a257f70c Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Thu, 26 Mar 2020 14:30:21 +0000 Subject: [PATCH 01/18] Add sync app skeleton --- monitoring/sychronisation/__init__.py | 0 monitoring/sychronisation/admin.py | 6 ++++++ monitoring/sychronisation/apps.py | 8 ++++++++ monitoring/sychronisation/migrations/__init__.py | 0 monitoring/sychronisation/models.py | 6 ++++++ monitoring/sychronisation/tests.py | 6 ++++++ monitoring/sychronisation/views.py | 6 ++++++ 7 files changed, 32 insertions(+) create mode 100644 monitoring/sychronisation/__init__.py create mode 100644 monitoring/sychronisation/admin.py create mode 100644 monitoring/sychronisation/apps.py create mode 100644 monitoring/sychronisation/migrations/__init__.py create mode 100644 monitoring/sychronisation/models.py create mode 100644 monitoring/sychronisation/tests.py create mode 100644 monitoring/sychronisation/views.py diff --git a/monitoring/sychronisation/__init__.py b/monitoring/sychronisation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/monitoring/sychronisation/admin.py b/monitoring/sychronisation/admin.py new file mode 100644 index 0000000..4255847 --- /dev/null +++ b/monitoring/sychronisation/admin.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.contrib import admin + +# Register your models here. diff --git a/monitoring/sychronisation/apps.py b/monitoring/sychronisation/apps.py new file mode 100644 index 0000000..80cb663 --- /dev/null +++ b/monitoring/sychronisation/apps.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class SychronisationConfig(AppConfig): + name = 'sychronisation' diff --git a/monitoring/sychronisation/migrations/__init__.py b/monitoring/sychronisation/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/monitoring/sychronisation/models.py b/monitoring/sychronisation/models.py new file mode 100644 index 0000000..c827610 --- /dev/null +++ b/monitoring/sychronisation/models.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models + +# Create your models here. diff --git a/monitoring/sychronisation/tests.py b/monitoring/sychronisation/tests.py new file mode 100644 index 0000000..52f77f9 --- /dev/null +++ b/monitoring/sychronisation/tests.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.test import TestCase + +# Create your tests here. diff --git a/monitoring/sychronisation/views.py b/monitoring/sychronisation/views.py new file mode 100644 index 0000000..1366def --- /dev/null +++ b/monitoring/sychronisation/views.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.shortcuts import render + +# Create your views here. From ef768c62348000d0e8b5dcfc658cdc82385e02b3 Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Thu, 26 Mar 2020 15:04:00 +0000 Subject: [PATCH 02/18] Correct line endings --- monitoring/sychronisation/admin.py | 12 ++++++------ monitoring/sychronisation/apps.py | 16 ++++++++-------- monitoring/sychronisation/models.py | 12 ++++++------ monitoring/sychronisation/tests.py | 12 ++++++------ monitoring/sychronisation/views.py | 12 ++++++------ 5 files changed, 32 insertions(+), 32 deletions(-) diff --git a/monitoring/sychronisation/admin.py b/monitoring/sychronisation/admin.py index 4255847..13be29d 100644 --- a/monitoring/sychronisation/admin.py +++ b/monitoring/sychronisation/admin.py @@ -1,6 +1,6 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.contrib import admin - -# Register your models here. +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.contrib import admin + +# Register your models here. diff --git a/monitoring/sychronisation/apps.py b/monitoring/sychronisation/apps.py index 80cb663..55b3c3b 100644 --- a/monitoring/sychronisation/apps.py +++ b/monitoring/sychronisation/apps.py @@ -1,8 +1,8 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.apps import AppConfig - - -class SychronisationConfig(AppConfig): - name = 'sychronisation' +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class SychronisationConfig(AppConfig): + name = 'sychronisation' diff --git a/monitoring/sychronisation/models.py b/monitoring/sychronisation/models.py index c827610..1dfab76 100644 --- a/monitoring/sychronisation/models.py +++ b/monitoring/sychronisation/models.py @@ -1,6 +1,6 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models - -# Create your models here. +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models + +# Create your models here. diff --git a/monitoring/sychronisation/tests.py b/monitoring/sychronisation/tests.py index 52f77f9..5982e6b 100644 --- a/monitoring/sychronisation/tests.py +++ b/monitoring/sychronisation/tests.py @@ -1,6 +1,6 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.test import TestCase - -# Create your tests here. +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.test import TestCase + +# Create your tests here. diff --git a/monitoring/sychronisation/views.py b/monitoring/sychronisation/views.py index 1366def..e784a0b 100644 --- a/monitoring/sychronisation/views.py +++ b/monitoring/sychronisation/views.py @@ -1,6 +1,6 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.shortcuts import render - -# Create your views here. +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.shortcuts import render + +# Create your views here. From 3201ed2e488859ad12ecb516b5b53d08c897fd20 Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Thu, 26 Mar 2020 16:24:02 +0000 Subject: [PATCH 03/18] Add basic models --- monitoring/sychronisation/models.py | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/monitoring/sychronisation/models.py b/monitoring/sychronisation/models.py index 1dfab76..fb0c8c4 100644 --- a/monitoring/sychronisation/models.py +++ b/monitoring/sychronisation/models.py @@ -3,4 +3,30 @@ from django.db import models -# Create your models here. + +class GridSite(models.Model): + fetched = models.DateTimeField(auto_now=True) + name = models.CharField(max_length=255, primary_key=True) + updated = models.DateTimeField() + + +class VSuperSummaries(models.Model): + Site = models.CharField(max_length=255, primary_key=True) + Year = models.IntegerField(primary_key=True) + Month = models.IntegerField(primary_key=True) + NumberOfJobs = models.IntegerField() + + class Meta: + managed = False + db_table = 'VSuperSummaries' + + +class VSyncRecords(models.Model): + Site = models.CharField(max_length=255, primary_key=True) + Year = models.IntegerField(primary_key=True) + Month = models.IntegerField(primary_key=True) + NumberOfJobs = models.IntegerField() + + class Meta: + managed = False + db_table = 'VSyncRecords' From 0020cbcb3874c9dbf531f436cc92f1bd97963338 Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Thu, 26 Mar 2020 16:31:11 +0000 Subject: [PATCH 04/18] Correct GridSite sync model --- monitoring/sychronisation/models.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/monitoring/sychronisation/models.py b/monitoring/sychronisation/models.py index fb0c8c4..9029a92 100644 --- a/monitoring/sychronisation/models.py +++ b/monitoring/sychronisation/models.py @@ -4,10 +4,13 @@ from django.db import models -class GridSite(models.Model): +class GridSiteSync(models.Model): fetched = models.DateTimeField(auto_now=True) - name = models.CharField(max_length=255, primary_key=True) - updated = models.DateTimeField() + site = models.CharField(max_length=255, primary_key=True) + year = models.IntegerField(primary_key=True) + month = models.IntegerField(primary_key=True) + site_count = models.IntegerField() + repository_count = models.IntegerField() class VSuperSummaries(models.Model): From dd1a212f52841a08b65f14c4e62cae3e886ee744 Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Thu, 26 Mar 2020 16:59:58 +0000 Subject: [PATCH 05/18] Add urls for sync --- monitoring/sychronisation/urls.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 monitoring/sychronisation/urls.py diff --git a/monitoring/sychronisation/urls.py b/monitoring/sychronisation/urls.py new file mode 100644 index 0000000..219ffdd --- /dev/null +++ b/monitoring/sychronisation/urls.py @@ -0,0 +1,13 @@ +from django.conf.urls import include, url + +from rest_framework import routers + +import views + +router = routers.SimpleRouter() +router.register(r'grid', views.GridSiteSyncViewSet) + + +urlpatterns = [ + url(r'^', include(router.urls)), +] From 5d5aeea87fcb1c3a86005066fd712cf1c91c1619 Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Thu, 26 Mar 2020 17:31:19 +0000 Subject: [PATCH 06/18] Add top level url for sync --- monitoring/urls.py | 1 + 1 file changed, 1 insertion(+) diff --git a/monitoring/urls.py b/monitoring/urls.py index 10c97b9..4cdf19e 100644 --- a/monitoring/urls.py +++ b/monitoring/urls.py @@ -7,6 +7,7 @@ path('', TemplateView.as_view(template_name='home.html'), name='home'), path('availability/', include('monitoring.availability.urls')), path('publishing/', include('monitoring.publishing.urls')), + path('synchronisation/', include('monitoring.synchronisation.urls')), path('benchmarks/', include('monitoring.benchmarks.urls')), path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), ] From d02efc175017d925ae40b4ee98d763cf1eac2230 Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Thu, 26 Mar 2020 17:34:25 +0000 Subject: [PATCH 07/18] Correct sync app name --- monitoring/{sychronisation => synchronisation}/__init__.py | 0 monitoring/{sychronisation => synchronisation}/admin.py | 0 monitoring/{sychronisation => synchronisation}/apps.py | 0 .../{sychronisation => synchronisation}/migrations/__init__.py | 0 monitoring/{sychronisation => synchronisation}/models.py | 0 monitoring/{sychronisation => synchronisation}/tests.py | 0 monitoring/{sychronisation => synchronisation}/urls.py | 0 monitoring/{sychronisation => synchronisation}/views.py | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename monitoring/{sychronisation => synchronisation}/__init__.py (100%) rename monitoring/{sychronisation => synchronisation}/admin.py (100%) rename monitoring/{sychronisation => synchronisation}/apps.py (100%) rename monitoring/{sychronisation => synchronisation}/migrations/__init__.py (100%) rename monitoring/{sychronisation => synchronisation}/models.py (100%) rename monitoring/{sychronisation => synchronisation}/tests.py (100%) rename monitoring/{sychronisation => synchronisation}/urls.py (100%) rename monitoring/{sychronisation => synchronisation}/views.py (100%) diff --git a/monitoring/sychronisation/__init__.py b/monitoring/synchronisation/__init__.py similarity index 100% rename from monitoring/sychronisation/__init__.py rename to monitoring/synchronisation/__init__.py diff --git a/monitoring/sychronisation/admin.py b/monitoring/synchronisation/admin.py similarity index 100% rename from monitoring/sychronisation/admin.py rename to monitoring/synchronisation/admin.py diff --git a/monitoring/sychronisation/apps.py b/monitoring/synchronisation/apps.py similarity index 100% rename from monitoring/sychronisation/apps.py rename to monitoring/synchronisation/apps.py diff --git a/monitoring/sychronisation/migrations/__init__.py b/monitoring/synchronisation/migrations/__init__.py similarity index 100% rename from monitoring/sychronisation/migrations/__init__.py rename to monitoring/synchronisation/migrations/__init__.py diff --git a/monitoring/sychronisation/models.py b/monitoring/synchronisation/models.py similarity index 100% rename from monitoring/sychronisation/models.py rename to monitoring/synchronisation/models.py diff --git a/monitoring/sychronisation/tests.py b/monitoring/synchronisation/tests.py similarity index 100% rename from monitoring/sychronisation/tests.py rename to monitoring/synchronisation/tests.py diff --git a/monitoring/sychronisation/urls.py b/monitoring/synchronisation/urls.py similarity index 100% rename from monitoring/sychronisation/urls.py rename to monitoring/synchronisation/urls.py diff --git a/monitoring/sychronisation/views.py b/monitoring/synchronisation/views.py similarity index 100% rename from monitoring/sychronisation/views.py rename to monitoring/synchronisation/views.py From 4d045d2b98f7be6bd820aa90c0806b53d481ec21 Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Thu, 26 Mar 2020 17:39:35 +0000 Subject: [PATCH 08/18] Add sync to apps --- monitoring/settings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/monitoring/settings.py b/monitoring/settings.py index 65d0352..2f9e7ef 100644 --- a/monitoring/settings.py +++ b/monitoring/settings.py @@ -77,6 +77,7 @@ 'rest_framework', 'monitoring.publishing', 'monitoring.availability', + 'monitoring.synchronisation', 'monitoring.benchmarks', ] From 0b6882161a821802f8143e2f4b7a38b4106860f0 Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Thu, 26 Mar 2020 18:00:20 +0000 Subject: [PATCH 09/18] Add serializer and add difference field --- monitoring/synchronisation/models.py | 1 + monitoring/synchronisation/serializers.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 monitoring/synchronisation/serializers.py diff --git a/monitoring/synchronisation/models.py b/monitoring/synchronisation/models.py index 9029a92..1b2e8a1 100644 --- a/monitoring/synchronisation/models.py +++ b/monitoring/synchronisation/models.py @@ -11,6 +11,7 @@ class GridSiteSync(models.Model): month = models.IntegerField(primary_key=True) site_count = models.IntegerField() repository_count = models.IntegerField() + difference = models.IntegerField() class VSuperSummaries(models.Model): diff --git a/monitoring/synchronisation/serializers.py b/monitoring/synchronisation/serializers.py new file mode 100644 index 0000000..1c87dc5 --- /dev/null +++ b/monitoring/synchronisation/serializers.py @@ -0,0 +1,15 @@ +from rest_framework import serializers + +from models import GridSiteSync + + +class GridSiteSyncSerializer(serializers.HyperlinkedModelSerializer): + # Override default format with None so that Python datetime is used as + # ouput format. Encoding will be determined by the renderer and can be + # formatted by a template filter. + updated = serializers.DateTimeField(format=None) + + class Meta: + model = GridSiteSync + fields = ('url', 'site', 'year', 'month', + 'site_count', 'repository_count', 'difference') From a580590f340548f4ea0663636382b0ff9ab0f498 Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Thu, 26 Mar 2020 18:18:28 +0000 Subject: [PATCH 10/18] Remove primary key args as no composite in Django --- monitoring/synchronisation/models.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/monitoring/synchronisation/models.py b/monitoring/synchronisation/models.py index 1b2e8a1..6e47490 100644 --- a/monitoring/synchronisation/models.py +++ b/monitoring/synchronisation/models.py @@ -6,9 +6,9 @@ class GridSiteSync(models.Model): fetched = models.DateTimeField(auto_now=True) - site = models.CharField(max_length=255, primary_key=True) - year = models.IntegerField(primary_key=True) - month = models.IntegerField(primary_key=True) + site = models.CharField(max_length=255) + year = models.IntegerField() + month = models.IntegerField() site_count = models.IntegerField() repository_count = models.IntegerField() difference = models.IntegerField() From 10fc20833f0e8678c9b47fbd4f3e95ba296ca881 Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Thu, 26 Mar 2020 18:24:47 +0000 Subject: [PATCH 11/18] Add unique_together constraint --- monitoring/synchronisation/models.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/monitoring/synchronisation/models.py b/monitoring/synchronisation/models.py index 6e47490..7e9da5a 100644 --- a/monitoring/synchronisation/models.py +++ b/monitoring/synchronisation/models.py @@ -13,6 +13,9 @@ class GridSiteSync(models.Model): repository_count = models.IntegerField() difference = models.IntegerField() + class Meta: + unique_together = ['site', 'year', 'month'] + class VSuperSummaries(models.Model): Site = models.CharField(max_length=255, primary_key=True) From 80e33a87f793c3bb53af8c78e099f97dbb79b2dc Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Thu, 26 Mar 2020 18:25:14 +0000 Subject: [PATCH 12/18] Add viewset mostly copied from pub to sync --- monitoring/synchronisation/views.py | 48 +++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/monitoring/synchronisation/views.py b/monitoring/synchronisation/views.py index e784a0b..ab5f581 100644 --- a/monitoring/synchronisation/views.py +++ b/monitoring/synchronisation/views.py @@ -1,6 +1,50 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.shortcuts import render +from django.db.models import Sum -# Create your views here. +from rest_framework import viewsets +from rest_framework.renderers import TemplateHTMLRenderer + +from models import GridSiteSync, VSuperSummaries, VSyncRecords +from serializers import GridSiteSyncSerializer + + +class GridSiteSyncViewSet(viewsets.ReadOnlyModelViewSet): + queryset = GridSiteSync.objects.all() + serializer_class = GridSiteSyncSerializer + template_name = 'gridsites.html' + + def retrieve(self, request, pk=None): + last_fetched = GridSiteSync.objects.aggregate(Max('fetched'))['fetched__max'] + # If there's no data then last_fetched is None. + if last_fetched is not None: + print last_fetched.replace(tzinfo=None), datetime.today() - timedelta(hours=1, seconds=20) + if last_fetched is None or last_fetched.replace(tzinfo=None) < (datetime.today() - timedelta(hours=1, seconds=20)): + print 'Out of date' + fetchset = VSuperSummaries.objects.using('grid').raw("SELECT Site, max(LatestEndTime) AS LatestPublish FROM VSuperSummaries WHERE Year=2019 GROUP BY 1;") + for f in fetchset: + GridSite.objects.update_or_create(defaults={'updated': f.LatestPublish}, name=f.Site) + else: + print 'No need to update' + + response = super(GridSiteSyncViewSet, self).retrieve(request) + date = response.data['updated'].replace(tzinfo=None) + + # Wrap data in a dict so that it can display in template. + if type(request.accepted_renderer) is TemplateHTMLRenderer: + # Single result put in list to work with same HTML template. + response.data = {'sites': [response.data], 'last_fetched': last_fetched} + + diff = datetime.today() - date + if diff <= timedelta(days=7): + response.data['returncode'] = 0 + response.data['stdout'] = "OK [ last published %s days ago: %s ]" % (diff.days, date.strftime("%Y-%m-%d")) + elif diff > timedelta(days=7): + response.data['returncode'] = 1 + response.data['stdout'] = "WARNING [ last published %s days ago: %s ]" % (diff.days, date.strftime("%Y-%m-%d")) + else: + response.data['returncode'] = 3 + response.data['stdout'] = "UNKNOWN" + + return response From 12583b5382e673ca23eb8d8013f7e234e4eeeb05 Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Wed, 22 Nov 2023 16:32:52 +0000 Subject: [PATCH 13/18] Fix Py3 compat and incorrect class - Absolute imports. - Print function. - Missing import. - Incorrect class reference. --- monitoring/synchronisation/serializers.py | 2 +- monitoring/synchronisation/urls.py | 2 +- monitoring/synchronisation/views.py | 14 ++++++++------ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/monitoring/synchronisation/serializers.py b/monitoring/synchronisation/serializers.py index 1c87dc5..8e49835 100644 --- a/monitoring/synchronisation/serializers.py +++ b/monitoring/synchronisation/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers -from models import GridSiteSync +from monitoring.synchronisation.models import GridSiteSync class GridSiteSyncSerializer(serializers.HyperlinkedModelSerializer): diff --git a/monitoring/synchronisation/urls.py b/monitoring/synchronisation/urls.py index 219ffdd..0128703 100644 --- a/monitoring/synchronisation/urls.py +++ b/monitoring/synchronisation/urls.py @@ -2,7 +2,7 @@ from rest_framework import routers -import views +from monitoring.synchronisation import views router = routers.SimpleRouter() router.register(r'grid', views.GridSiteSyncViewSet) diff --git a/monitoring/synchronisation/views.py b/monitoring/synchronisation/views.py index ab5f581..636c30f 100644 --- a/monitoring/synchronisation/views.py +++ b/monitoring/synchronisation/views.py @@ -1,13 +1,15 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals +from datetime import datetime, timedelta + from django.db.models import Sum from rest_framework import viewsets from rest_framework.renderers import TemplateHTMLRenderer -from models import GridSiteSync, VSuperSummaries, VSyncRecords -from serializers import GridSiteSyncSerializer +from monitoring.synchronisation.models import GridSiteSync, VSuperSummaries, VSyncRecords +from monitoring.synchronisation.serializers import GridSiteSyncSerializer class GridSiteSyncViewSet(viewsets.ReadOnlyModelViewSet): @@ -19,14 +21,14 @@ def retrieve(self, request, pk=None): last_fetched = GridSiteSync.objects.aggregate(Max('fetched'))['fetched__max'] # If there's no data then last_fetched is None. if last_fetched is not None: - print last_fetched.replace(tzinfo=None), datetime.today() - timedelta(hours=1, seconds=20) + print(last_fetched.replace(tzinfo=None), datetime.today() - timedelta(hours=1, seconds=20)) if last_fetched is None or last_fetched.replace(tzinfo=None) < (datetime.today() - timedelta(hours=1, seconds=20)): - print 'Out of date' + print('Out of date') fetchset = VSuperSummaries.objects.using('grid').raw("SELECT Site, max(LatestEndTime) AS LatestPublish FROM VSuperSummaries WHERE Year=2019 GROUP BY 1;") for f in fetchset: - GridSite.objects.update_or_create(defaults={'updated': f.LatestPublish}, name=f.Site) + GridSiteSync.objects.update_or_create(defaults={'updated': f.LatestPublish}, name=f.Site) else: - print 'No need to update' + print('No need to update') response = super(GridSiteSyncViewSet, self).retrieve(request) date = response.data['updated'].replace(tzinfo=None) From ab3ffa66dd03a1280c0ce182a16d22d4062460bb Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Wed, 22 Nov 2023 16:41:51 +0000 Subject: [PATCH 14/18] Fix primary keys Can't have more than one field in set as primary key, but can use the unique_together option. --- monitoring/synchronisation/models.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/monitoring/synchronisation/models.py b/monitoring/synchronisation/models.py index 7e9da5a..c42dba8 100644 --- a/monitoring/synchronisation/models.py +++ b/monitoring/synchronisation/models.py @@ -18,22 +18,24 @@ class Meta: class VSuperSummaries(models.Model): - Site = models.CharField(max_length=255, primary_key=True) - Year = models.IntegerField(primary_key=True) - Month = models.IntegerField(primary_key=True) + Site = models.CharField(max_length=255) + Year = models.IntegerField() + Month = models.IntegerField() NumberOfJobs = models.IntegerField() class Meta: managed = False db_table = 'VSuperSummaries' + unique_together = ('Site', 'Year', 'Month') class VSyncRecords(models.Model): - Site = models.CharField(max_length=255, primary_key=True) - Year = models.IntegerField(primary_key=True) - Month = models.IntegerField(primary_key=True) + Site = models.CharField(max_length=255) + Year = models.IntegerField() + Month = models.IntegerField() NumberOfJobs = models.IntegerField() class Meta: managed = False db_table = 'VSyncRecords' + unique_together = ('Site', 'Year', 'Month') From 1ec9c654e5c664c1be4be85f30d4f863d0acbe05 Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Wed, 22 Nov 2023 16:54:00 +0000 Subject: [PATCH 15/18] Replace Sum with missing Max --- monitoring/synchronisation/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monitoring/synchronisation/views.py b/monitoring/synchronisation/views.py index 636c30f..5a2fecc 100644 --- a/monitoring/synchronisation/views.py +++ b/monitoring/synchronisation/views.py @@ -3,7 +3,7 @@ from datetime import datetime, timedelta -from django.db.models import Sum +from django.db.models import Max from rest_framework import viewsets from rest_framework.renderers import TemplateHTMLRenderer From 0910fd1ed36ad9e4aaed4aac0415df3553354aec Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Fri, 20 Jun 2025 16:30:28 +0100 Subject: [PATCH 16/18] Fix spelling and app name to use relative path --- monitoring/synchronisation/apps.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/monitoring/synchronisation/apps.py b/monitoring/synchronisation/apps.py index 55b3c3b..4c15024 100644 --- a/monitoring/synchronisation/apps.py +++ b/monitoring/synchronisation/apps.py @@ -4,5 +4,5 @@ from django.apps import AppConfig -class SychronisationConfig(AppConfig): - name = 'sychronisation' +class SynchronisationConfig(AppConfig): + name = 'monitoring.synchronisation' From 93eb5a6788a104d4424f3ed8ea45ea67de2514d8 Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Thu, 28 Aug 2025 09:27:09 +0100 Subject: [PATCH 17/18] Update url() to path() --- monitoring/synchronisation/urls.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/monitoring/synchronisation/urls.py b/monitoring/synchronisation/urls.py index 0128703..c28ee6f 100644 --- a/monitoring/synchronisation/urls.py +++ b/monitoring/synchronisation/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import include, url +from django.urls import include, path from rest_framework import routers @@ -9,5 +9,5 @@ urlpatterns = [ - url(r'^', include(router.urls)), + path('', include(router.urls)), ] From e052e9eedd056e320fba4ba5587d0163a6407059 Mon Sep 17 00:00:00 2001 From: Adrian Coveney Date: Fri, 20 Jun 2025 17:01:55 +0100 Subject: [PATCH 18/18] *** TEMP DEBUG TRUE *** --- monitoring/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monitoring/settings.py b/monitoring/settings.py index 2f9e7ef..c921025 100644 --- a/monitoring/settings.py +++ b/monitoring/settings.py @@ -21,7 +21,7 @@ # See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/ # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = False +DEBUG = True try: