From 86a74b62c1ed6b3b5ff5e99176d00780b26e6eaa Mon Sep 17 00:00:00 2001 From: alancear Date: Wed, 15 May 2019 20:33:04 +0200 Subject: [PATCH 01/13] Currencies --- backend/base_app/settings/main.py | 1 + backend/external_data/__init__.py | 0 backend/external_data/admin.py | 3 +++ backend/external_data/apps.py | 5 +++++ backend/external_data/management/__init__.py | 0 .../external_data/management/commands/__init__.py | 0 .../external_data/management/commands/_private.py | 0 .../management/commands/update_data.py | 13 +++++++++++++ backend/external_data/migrations/__init__.py | 0 backend/external_data/models.py | 3 +++ backend/external_data/tests.py | 3 +++ backend/external_data/views.py | 3 +++ 12 files changed, 31 insertions(+) create mode 100644 backend/external_data/__init__.py create mode 100644 backend/external_data/admin.py create mode 100644 backend/external_data/apps.py create mode 100644 backend/external_data/management/__init__.py create mode 100644 backend/external_data/management/commands/__init__.py create mode 100644 backend/external_data/management/commands/_private.py create mode 100644 backend/external_data/management/commands/update_data.py create mode 100644 backend/external_data/migrations/__init__.py create mode 100644 backend/external_data/models.py create mode 100644 backend/external_data/tests.py create mode 100644 backend/external_data/views.py diff --git a/backend/base_app/settings/main.py b/backend/base_app/settings/main.py index 17bebd91..16c4a91d 100644 --- a/backend/base_app/settings/main.py +++ b/backend/base_app/settings/main.py @@ -63,6 +63,7 @@ INSTALLED_APPS = [ "rest_framework.authtoken", "backend_app", "base_app", + "external_data", "webpack_loader", "django_filters", ] diff --git a/backend/external_data/__init__.py b/backend/external_data/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/external_data/admin.py b/backend/external_data/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/backend/external_data/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/backend/external_data/apps.py b/backend/external_data/apps.py new file mode 100644 index 00000000..f63db719 --- /dev/null +++ b/backend/external_data/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ExternalDataConfig(AppConfig): + name = 'external_data' diff --git a/backend/external_data/management/__init__.py b/backend/external_data/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/external_data/management/commands/__init__.py b/backend/external_data/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/external_data/management/commands/_private.py b/backend/external_data/management/commands/_private.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/external_data/management/commands/update_data.py b/backend/external_data/management/commands/update_data.py new file mode 100644 index 00000000..34ee8d3a --- /dev/null +++ b/backend/external_data/management/commands/update_data.py @@ -0,0 +1,13 @@ +import logging + +from django.core.management.base import BaseCommand, CommandError + +class Command(BaseCommand): + help = 'Closes the specified poll for voting' + + # def add_arguments(self, parser): + # parser.add_argument('poll_id', nargs='+', type=int) + + def handle(self, *args, **options): + logger = logging.getLogger("django") + logger.info("test") diff --git a/backend/external_data/migrations/__init__.py b/backend/external_data/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/external_data/models.py b/backend/external_data/models.py new file mode 100644 index 00000000..71a83623 --- /dev/null +++ b/backend/external_data/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/backend/external_data/tests.py b/backend/external_data/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/backend/external_data/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/backend/external_data/views.py b/backend/external_data/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/backend/external_data/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. -- GitLab From 6adb8dcf89043d6d96870e0ef704d102edff90d3 Mon Sep 17 00:00:00 2001 From: alancear Date: Tue, 21 May 2019 19:45:54 +0200 Subject: [PATCH 02/13] tests_currencies --- .../external_data/management/commands/update_data.py | 10 ++++++++++ docker-compose.yml | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/backend/external_data/management/commands/update_data.py b/backend/external_data/management/commands/update_data.py index 34ee8d3a..dffb196a 100644 --- a/backend/external_data/management/commands/update_data.py +++ b/backend/external_data/management/commands/update_data.py @@ -1,4 +1,5 @@ import logging +import os from django.core.management.base import BaseCommand, CommandError @@ -10,4 +11,13 @@ class Command(BaseCommand): def handle(self, *args, **options): logger = logging.getLogger("django") + os.environ["FIXER_API_TOKEN"] + logger.info(os.environ["FIXER_API_TOKEN"]) logger.info("test") + logger = logging.getLogger("django") + for currency in Currency.objects.all(): + currency.one_EUR_in_this_currency = 1 + currency.save() + + for currency in Currency.objects.all(): + logger.info(currency.code + " " + str(currency.one_EUR_in_this_currency)) diff --git a/docker-compose.yml b/docker-compose.yml index a6ac65e0..a5cf6d66 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -29,7 +29,7 @@ services: networks: [backend-nginx, backend-db] environment: WAIT_HOSTS: database:5432 # For the 'wait' script, so that we are sure the db is up and running - env_file: [./server/envs/db.env, ./server/envs/django.env] + env_file: [./server/envs/db.env, ./server/envs/django.env, ./server/envs/external_data.env] # Run the django developpement server on image startup. command: /bin/sh -c "/wait && cd backend && ./entry.sh && ./manage.py runserver 0.0.0.0:8000 --nostatic" # Required that the `database` and `frontend` service are up and running. -- GitLab From 5bc2ca4d3a04acbee0bddc9c7c095f0b35cafd3d Mon Sep 17 00:00:00 2001 From: alancear Date: Tue, 21 May 2019 20:31:03 +0200 Subject: [PATCH 03/13] currencies_ok --- .../management/commands/update_data.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/backend/external_data/management/commands/update_data.py b/backend/external_data/management/commands/update_data.py index dffb196a..9c41c525 100644 --- a/backend/external_data/management/commands/update_data.py +++ b/backend/external_data/management/commands/update_data.py @@ -1,6 +1,8 @@ import logging import os +import requests +from backend_app.models.currency import Currency from django.core.management.base import BaseCommand, CommandError class Command(BaseCommand): @@ -13,11 +15,22 @@ class Command(BaseCommand): logger = logging.getLogger("django") os.environ["FIXER_API_TOKEN"] logger.info(os.environ["FIXER_API_TOKEN"]) + key = os.environ["FIXER_API_TOKEN"] + logger.info(key) logger.info("test") + + response = requests.get("http://data.fixer.io/api/latest" + '?access_key=' + key) + + logger.info(response) + logger = logging.getLogger("django") for currency in Currency.objects.all(): - currency.one_EUR_in_this_currency = 1 - currency.save() + for fixer_cur in response.json()['rates']: + if(fixer_cur == currency.code): + currency.one_EUR_in_this_currency = response.json()['rates'][currency.code] + currency.save() + + for currency in Currency.objects.all(): logger.info(currency.code + " " + str(currency.one_EUR_in_this_currency)) -- GitLab From faf76fdbf737284ae4588cf0b1c9f90f9628d87d Mon Sep 17 00:00:00 2001 From: Segolene Date: Sat, 25 May 2019 15:53:13 +0200 Subject: [PATCH 04/13] Create UtcPartner model and delete Speciality and Department models Forgot to commit a modif on offer.py New model and modif on models Import exchanges --- backend/backend_app/admin.py | 4 - .../migrations/0009_auto_20190527_1615.py | 82 +++++++++++++++++++ .../migrations/0010_auto_20190527_1647.py | 18 ++++ backend/backend_app/models/department.py | 27 ------ backend/backend_app/models/exchange.py | 2 +- backend/backend_app/models/offer.py | 7 +- backend/backend_app/models/specialty.py | 32 -------- backend/backend_app/models/utcPartner.py | 26 ++++++ backend/backend_app/viewsets.py | 4 - .../management/commands/import_utc_data.py | 54 ++++++++++++ 10 files changed, 184 insertions(+), 72 deletions(-) create mode 100644 backend/backend_app/migrations/0009_auto_20190527_1615.py create mode 100644 backend/backend_app/migrations/0010_auto_20190527_1647.py delete mode 100644 backend/backend_app/models/department.py delete mode 100644 backend/backend_app/models/specialty.py create mode 100644 backend/backend_app/models/utcPartner.py create mode 100644 backend/external_data/management/commands/import_utc_data.py diff --git a/backend/backend_app/admin.py b/backend/backend_app/admin.py index 14115388..b3faa50b 100644 --- a/backend/backend_app/admin.py +++ b/backend/backend_app/admin.py @@ -15,14 +15,12 @@ from backend_app.models.countryTaggedItem import CountryTaggedItem from backend_app.models.course import Course from backend_app.models.courseFeedback import CourseFeedback from backend_app.models.currency import Currency -from backend_app.models.department import Department from backend_app.models.exchange import Exchange from backend_app.models.exchangeFeedback import ExchangeFeedback from backend_app.models.for_testing.moderation import ForTestingModeration from backend_app.models.for_testing.versioning import ForTestingVersioning from backend_app.models.offer import Offer from backend_app.models.pendingModeration import PendingModeration -from backend_app.models.specialty import Specialty from backend_app.models.tag import Tag from backend_app.models.university import University from backend_app.models.universityDri import UniversityDri @@ -45,12 +43,10 @@ ALL_MODELS = [ Course, CourseFeedback, Currency, - Department, Offer, PendingModeration, Exchange, ExchangeFeedback, - Specialty, Tag, University, UniversityDri, diff --git a/backend/backend_app/migrations/0009_auto_20190527_1615.py b/backend/backend_app/migrations/0009_auto_20190527_1615.py new file mode 100644 index 00000000..fc9104ea --- /dev/null +++ b/backend/backend_app/migrations/0009_auto_20190527_1615.py @@ -0,0 +1,82 @@ +# Generated by Django 2.1.7 on 2019-05-27 14:15 + +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('backend_app', '0008_auto_20190525_1522'), + ] + + operations = [ + migrations.CreateModel( + name='UtcPartner', + fields=[ + ('utc_id', models.IntegerField(primary_key=True, serialize=False)), + ('univ_name', models.CharField(max_length=100)), + ('address1', models.CharField(max_length=250)), + ('address2', models.CharField(max_length=250)), + ('zipcode', models.CharField(max_length=15)), + ('iso_code', models.CharField(max_length=50)), + ('city', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='backend_app.City')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AlterUniqueTogether( + name='specialty', + unique_together=set(), + ), + migrations.RemoveField( + model_name='specialty', + name='department', + ), + migrations.RemoveField( + model_name='offer', + name='university', + ), + migrations.AlterField( + model_name='coursefeedback', + name='adequation', + field=models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(-5), django.core.validators.MaxValueValidator(5)]), + ), + migrations.AlterField( + model_name='coursefeedback', + name='language_following_ease', + field=models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(-5), django.core.validators.MaxValueValidator(5)]), + ), + migrations.AlterField( + model_name='coursefeedback', + name='working_dose', + field=models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(-5), django.core.validators.MaxValueValidator(5)]), + ), + migrations.AlterField( + model_name='exchangefeedback', + name='academical_level_appreciation', + field=models.IntegerField(validators=[django.core.validators.MinValueValidator(-5), django.core.validators.MaxValueValidator(5)]), + ), + migrations.RemoveField( + model_name='offer', + name='specialties', + ), + migrations.AddField( + model_name='offer', + name='specialties', + field=models.CharField(max_length=300, null=True), + ), + migrations.DeleteModel( + name='Department', + ), + migrations.DeleteModel( + name='Specialty', + ), + migrations.AddField( + model_name='offer', + name='utc_parter', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='backend_app.UtcPartner'), + ), + ] diff --git a/backend/backend_app/migrations/0010_auto_20190527_1647.py b/backend/backend_app/migrations/0010_auto_20190527_1647.py new file mode 100644 index 00000000..868b4f89 --- /dev/null +++ b/backend/backend_app/migrations/0010_auto_20190527_1647.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.7 on 2019-05-27 14:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('backend_app', '0009_auto_20190527_1615'), + ] + + operations = [ + migrations.AlterField( + model_name='exchange', + name='student_minor', + field=models.CharField(max_length=7, null=True), + ), + ] diff --git a/backend/backend_app/models/department.py b/backend/backend_app/models/department.py deleted file mode 100644 index 1669fd2d..00000000 --- a/backend/backend_app/models/department.py +++ /dev/null @@ -1,27 +0,0 @@ -from django.db import models - -from backend_app.models.abstract.base import ( - BaseModel, - BaseModelSerializer, - BaseModelViewSet, -) -from backend_app.permissions.app_permissions import ReadOnly - - -class Department(BaseModel): - code = models.CharField(primary_key=True, max_length=6) - name = models.CharField(max_length=100) - active = models.BooleanField() - - -class DepartmentSerializer(BaseModelSerializer): - class Meta: - model = Department - fields = "__all__" - - -class DepartmentViewSet(BaseModelViewSet): - queryset = Department.objects.all() # pylint: disable=E1101 - serializer_class = DepartmentSerializer - permission_classes = (ReadOnly,) - end_point_route = "departments" diff --git a/backend/backend_app/models/exchange.py b/backend/backend_app/models/exchange.py index 3c266593..baced3a5 100644 --- a/backend/backend_app/models/exchange.py +++ b/backend/backend_app/models/exchange.py @@ -18,7 +18,7 @@ class Exchange(BaseModel): dual_degree = models.BooleanField() master_obtained = models.BooleanField() student_major = models.CharField(max_length=20) - student_minor = models.CharField(max_length=7) + student_minor = models.CharField(max_length=7, null=True) student_option = models.CharField(max_length=7) utc_allow_courses = models.BooleanField() diff --git a/backend/backend_app/models/offer.py b/backend/backend_app/models/offer.py index 0efa43d9..6ced19ac 100644 --- a/backend/backend_app/models/offer.py +++ b/backend/backend_app/models/offer.py @@ -6,13 +6,12 @@ from backend_app.models.abstract.base import ( BaseModelViewSet, ) from backend_app.models.shared import SEMESTER_OPTIONS -from backend_app.models.specialty import Specialty -from backend_app.models.university import University +from backend_app.models.utcPartner import UtcPartner from backend_app.permissions.app_permissions import ReadOnly class Offer(BaseModel): - university = models.ForeignKey(University, on_delete=models.PROTECT) + utc_parter = models.ForeignKey(UtcPartner, on_delete=models.PROTECT, null=True) year = models.PositiveIntegerField(default=2018) semester = models.CharField(max_length=2, choices=SEMESTER_OPTIONS, default="a") @@ -21,7 +20,7 @@ class Offer(BaseModel): nb_seats_offered_exchange = models.PositiveIntegerField(null=True) nb_seats_offered_double_degree = models.PositiveIntegerField(null=True) - specialties = models.ManyToManyField(Specialty, related_name="has_seats_at_univ") + specialties = models.CharField(max_length=300, null=True) class OfferSerializer(BaseModelSerializer): diff --git a/backend/backend_app/models/specialty.py b/backend/backend_app/models/specialty.py deleted file mode 100644 index 7daaea6d..00000000 --- a/backend/backend_app/models/specialty.py +++ /dev/null @@ -1,32 +0,0 @@ -from django.db import models - -from backend_app.models.abstract.base import ( - BaseModel, - BaseModelSerializer, - BaseModelViewSet, -) -from backend_app.models.department import Department -from backend_app.permissions.app_permissions import ReadOnly - - -class Specialty(BaseModel): - code = models.CharField(max_length=6) - department = models.ForeignKey(Department, on_delete=models.PROTECT) - name = models.CharField(max_length=100) - active = models.BooleanField() - - class Meta: - unique_together = ("code", "department") - - -class SpecialtySerializer(BaseModelSerializer): - class Meta: - model = Specialty - fields = "__all__" - - -class SpecialtyViewSet(BaseModelViewSet): - queryset = Specialty.objects.all() # pylint: disable=E1101 - serializer_class = SpecialtySerializer - permission_classes = (ReadOnly,) - end_point_route = "specialties" diff --git a/backend/backend_app/models/utcPartner.py b/backend/backend_app/models/utcPartner.py new file mode 100644 index 00000000..c52485e1 --- /dev/null +++ b/backend/backend_app/models/utcPartner.py @@ -0,0 +1,26 @@ +from backend_app.models.abstract.base import BaseModel, BaseModelSerializer, BaseModelViewSet +from django.db import models + +from backend_app.models.city import City + + +class UtcPartner(BaseModel): + utc_id = models.IntegerField(primary_key=True) + univ_name = models.CharField(max_length=100) + address1 = models.CharField(max_length=250) + address2 = models.CharField(max_length=250) + zipcode = models.CharField(max_length=15) + city = models.ForeignKey(City, on_delete=models.PROTECT) + iso_code = models.CharField(max_length=50) + + +class UtcPartnerSerializer(BaseModelSerializer): + class Meta: + model = UtcPartner + fields = BaseModelSerializer.Meta.fields + ("utc_id", "univ_name") + + +class UtcPartnerViewSet(BaseModelViewSet): + queryset = UtcPartner.objects.all() + serializer_class = UtcPartnerSerializer + end_point_route = "utc_partners" diff --git a/backend/backend_app/viewsets.py b/backend/backend_app/viewsets.py index 3d694e1b..6842e1a2 100644 --- a/backend/backend_app/viewsets.py +++ b/backend/backend_app/viewsets.py @@ -16,7 +16,6 @@ from backend_app.models.countryScholarship import CountryScholarshipViewSet from backend_app.models.countryTaggedItem import CountryTaggedItemViewSet from backend_app.models.courseFeedback import CourseFeedback from backend_app.models.currency import CurrencyViewSet -from backend_app.models.department import DepartmentViewSet from backend_app.models.exchangeFeedback import ExchangeFeedbackViewSet from backend_app.models.file_picture import FileViewSet, PictureViewSet from backend_app.models.for_testing.moderation import ForTestingModerationViewSet @@ -27,7 +26,6 @@ from backend_app.models.pendingModeration import ( PendingModerationViewSet, PendingModerationObjViewSet, ) -from backend_app.models.specialty import SpecialtyViewSet from backend_app.models.tag import TagViewSet from backend_app.models.university import UniversityViewSet from backend_app.models.universityDri import UniversityDriViewSet @@ -62,7 +60,6 @@ ALL_API_VIEWSETS = [ CountryTaggedItemViewSet, CourseFeedbackViewSet, CurrencyViewSet, - DepartmentViewSet, OfferViewSet, LanguageViewSet, PendingModerationViewSet, @@ -70,7 +67,6 @@ ALL_API_VIEWSETS = [ FileViewSet, PictureViewSet, ExchangeFeedbackViewSet, - SpecialtyViewSet, TagViewSet, UniversityViewSet, UniversityDriViewSet, diff --git a/backend/external_data/management/commands/import_utc_data.py b/backend/external_data/management/commands/import_utc_data.py new file mode 100644 index 00000000..55f49b79 --- /dev/null +++ b/backend/external_data/management/commands/import_utc_data.py @@ -0,0 +1,54 @@ +import logging +import os +import requests + +from backend_app.models.exchange import Exchange +from backend_app.models.course import Course +from backend_app.models.university import University +from backend_app.models.utcPartner import UtcPartner +from django.core.management.base import BaseCommand, CommandError + + +class Command(BaseCommand): + help = 'Closes the specified poll for voting' + + # def add_arguments(self, parser): + # parser.add_argument('poll_id', nargs='+', type=int) + + + def handle(self, *args, **options): + logger = logging.getLogger("django") + os.environ["FIXER_API_TOKEN"] + logger.info(os.environ["FIXER_API_TOKEN"]) + logger.info("test") + + response = requests.get("http://10.83.255.117:8082/api/exchanges") + + logger.info(response) + + logger = logging.getLogger("django") + + for exchange in response.json()["content"]: + print(exchange) + + try: + univ = University.objects.get(utc_id=exchange['idEtab']) + except University.DoesNotExist: + univ = University.objects.create(utc_id=exchange['idEtab']) + + Exchange.objects.update_or_create( + utc_departure_id=exchange['idDepart'], + defaults={"utc_univ_id": univ, + "semester": exchange["semestreDepart"][0], + "year": exchange["semestreDepart"][1:], + "duration": exchange["duree"], + "dual_degree": exchange["doubleDiplome"], + "master_obtained": exchange["master"], + "student_major": exchange["specialite"], + "student_minor": exchange["option"], + "utc_allow_courses": exchange["autorisationTransfertUv"], + "utc_allow_login": exchange["autorisationTransfertLogin"], + }) + + for exchange in Exchange.objects.all(): + logger.info("Départ : " + str(exchange.utc_departure_id)) -- GitLab From 24e4257357fd3367f66be7d9f94612d31a1c5bd2 Mon Sep 17 00:00:00 2001 From: alancear Date: Mon, 27 May 2019 18:18:10 +0200 Subject: [PATCH 05/13] currencies et update ok --- backend/backend_app/admin.py | 2 ++ .../migrations/0011_updatedatefixer.py | 23 +++++++++++++++++++ backend/backend_app/models/updateDateFixer.py | 6 +++++ .../management/commands/update_data.py | 15 ++++++++---- 4 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 backend/backend_app/migrations/0011_updatedatefixer.py create mode 100644 backend/backend_app/models/updateDateFixer.py diff --git a/backend/backend_app/admin.py b/backend/backend_app/admin.py index b3faa50b..d7f26184 100644 --- a/backend/backend_app/admin.py +++ b/backend/backend_app/admin.py @@ -30,6 +30,7 @@ from backend_app.models.universitySemestersDates import UniversitySemestersDates from backend_app.models.universityTaggedItem import UniversityTaggedItem from backend_app.models.userData import UserData from backend_app.models.version import Version +from backend_app.models.updateDateFixer import updateDateFixer ALL_MODELS = [ Campus, @@ -54,6 +55,7 @@ ALL_MODELS = [ UniversityScholarship, UniversitySemestersDates, UniversityTaggedItem, + updateDateFixer, UserData, Version, ] diff --git a/backend/backend_app/migrations/0011_updatedatefixer.py b/backend/backend_app/migrations/0011_updatedatefixer.py new file mode 100644 index 00000000..a96fdcf3 --- /dev/null +++ b/backend/backend_app/migrations/0011_updatedatefixer.py @@ -0,0 +1,23 @@ +# Generated by Django 2.1.7 on 2019-05-27 16:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('backend_app', '0010_auto_20190527_1647'), + ] + + operations = [ + migrations.CreateModel( + name='updateDateFixer', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('update_date', models.DateField()), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/backend/backend_app/models/updateDateFixer.py b/backend/backend_app/models/updateDateFixer.py new file mode 100644 index 00000000..f229ade3 --- /dev/null +++ b/backend/backend_app/models/updateDateFixer.py @@ -0,0 +1,6 @@ +from django.db import models + +from backend_app.models.abstract.base import BaseModel + +class updateDateFixer(BaseModel): + update_date = models.DateField() diff --git a/backend/external_data/management/commands/update_data.py b/backend/external_data/management/commands/update_data.py index 9c41c525..846464ab 100644 --- a/backend/external_data/management/commands/update_data.py +++ b/backend/external_data/management/commands/update_data.py @@ -2,7 +2,9 @@ import logging import os import requests +from datetime import date from backend_app.models.currency import Currency +from backend_app.models.updateDateFixer import updateDateFixer from django.core.management.base import BaseCommand, CommandError class Command(BaseCommand): @@ -24,13 +26,16 @@ class Command(BaseCommand): logger.info(response) logger = logging.getLogger("django") - for currency in Currency.objects.all(): - for fixer_cur in response.json()['rates']: - if(fixer_cur == currency.code): - currency.one_EUR_in_this_currency = response.json()['rates'][currency.code] - currency.save() + for (k,v) in response.json()['rates'].items(): + Currency.objects.update_or_create( + code=k, + defaults={"one_EUR_in_this_currency": v + }) + updateDateFixer.objects.update_or_create( + update_date = date.today() + ) for currency in Currency.objects.all(): logger.info(currency.code + " " + str(currency.one_EUR_in_this_currency)) -- GitLab From 3f1e0744a80657bd0c6b122c8f4b0668d86db8fe Mon Sep 17 00:00:00 2001 From: alancear Date: Thu, 30 May 2019 14:18:12 +0200 Subject: [PATCH 06/13] changement modele date_update --- backend/backend_app/admin.py | 2 -- .../migrations/0012_delete_updatedatefixer.py | 16 ++++++++++ backend/external_data/admin.py | 30 ++++++++++++++++++- .../management/commands/update_data.py | 4 +-- backend/external_data/models.py | 6 +++- 5 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 backend/backend_app/migrations/0012_delete_updatedatefixer.py diff --git a/backend/backend_app/admin.py b/backend/backend_app/admin.py index d7f26184..b3faa50b 100644 --- a/backend/backend_app/admin.py +++ b/backend/backend_app/admin.py @@ -30,7 +30,6 @@ from backend_app.models.universitySemestersDates import UniversitySemestersDates from backend_app.models.universityTaggedItem import UniversityTaggedItem from backend_app.models.userData import UserData from backend_app.models.version import Version -from backend_app.models.updateDateFixer import updateDateFixer ALL_MODELS = [ Campus, @@ -55,7 +54,6 @@ ALL_MODELS = [ UniversityScholarship, UniversitySemestersDates, UniversityTaggedItem, - updateDateFixer, UserData, Version, ] diff --git a/backend/backend_app/migrations/0012_delete_updatedatefixer.py b/backend/backend_app/migrations/0012_delete_updatedatefixer.py new file mode 100644 index 00000000..96ee0b42 --- /dev/null +++ b/backend/backend_app/migrations/0012_delete_updatedatefixer.py @@ -0,0 +1,16 @@ +# Generated by Django 2.1.7 on 2019-05-30 12:12 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('backend_app', '0011_updatedatefixer'), + ] + + operations = [ + migrations.DeleteModel( + name='updateDateFixer', + ), + ] diff --git a/backend/external_data/admin.py b/backend/external_data/admin.py index 8c38f3f3..95c34c08 100644 --- a/backend/external_data/admin.py +++ b/backend/external_data/admin.py @@ -1,3 +1,31 @@ from django.contrib import admin +from reversion_compare.admin import CompareVersionAdmin -# Register your models here. +from backend_app.models.abstract.versionedEssentialModule import ( + VersionedEssentialModule, +) + +from external_data.models import externalDatainfoDate + +ALL_MODELS = [ + + externalDatainfoDate, + +] + +CLASSIC_MODELS = filter( + lambda m: not issubclass(m, VersionedEssentialModule), ALL_MODELS +) +VERSIONED_MODELS = filter(lambda m: issubclass(m, VersionedEssentialModule), ALL_MODELS) + +####### +# Register the models +####### + +for Model in CLASSIC_MODELS: + # Register the model in the admin in a standard way + admin.site.register(Model) + +for Model in VERSIONED_MODELS: + # Register the model in the admin with versioning + admin.site.register(Model, CompareVersionAdmin) diff --git a/backend/external_data/management/commands/update_data.py b/backend/external_data/management/commands/update_data.py index 846464ab..ca9ab116 100644 --- a/backend/external_data/management/commands/update_data.py +++ b/backend/external_data/management/commands/update_data.py @@ -4,7 +4,7 @@ import requests from datetime import date from backend_app.models.currency import Currency -from backend_app.models.updateDateFixer import updateDateFixer +from external_data.models import externalDatainfoDate from django.core.management.base import BaseCommand, CommandError class Command(BaseCommand): @@ -33,7 +33,7 @@ class Command(BaseCommand): defaults={"one_EUR_in_this_currency": v }) - updateDateFixer.objects.update_or_create( + externalDatainfoDate.objects.update_or_create( update_date = date.today() ) diff --git a/backend/external_data/models.py b/backend/external_data/models.py index 71a83623..ea9a5d25 100644 --- a/backend/external_data/models.py +++ b/backend/external_data/models.py @@ -1,3 +1,7 @@ from django.db import models -# Create your models here. +from backend_app.models.abstract.base import BaseModel + +# TODO change name +class externalDatainfoDate(BaseModel): + update_date = models.DateField() -- GitLab From f3262e6a7bfb49d1141f1212e5b57bc18c00e9a4 Mon Sep 17 00:00:00 2001 From: alancear Date: Thu, 30 May 2019 14:18:12 +0200 Subject: [PATCH 07/13] changement modele date_update --- backend/backend_app/models/updateDateFixer.py | 6 ----- .../external_data/migrations/0001_initial.py | 24 +++++++++++++++++++ backend/external_data/tests.py | 3 --- 3 files changed, 24 insertions(+), 9 deletions(-) delete mode 100644 backend/backend_app/models/updateDateFixer.py create mode 100644 backend/external_data/migrations/0001_initial.py delete mode 100644 backend/external_data/tests.py diff --git a/backend/backend_app/models/updateDateFixer.py b/backend/backend_app/models/updateDateFixer.py deleted file mode 100644 index f229ade3..00000000 --- a/backend/backend_app/models/updateDateFixer.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.db import models - -from backend_app.models.abstract.base import BaseModel - -class updateDateFixer(BaseModel): - update_date = models.DateField() diff --git a/backend/external_data/migrations/0001_initial.py b/backend/external_data/migrations/0001_initial.py new file mode 100644 index 00000000..eebe88cd --- /dev/null +++ b/backend/external_data/migrations/0001_initial.py @@ -0,0 +1,24 @@ +# Generated by Django 2.1.7 on 2019-05-30 12:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='externalDatainfoDate', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('update_date', models.DateField()), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/backend/external_data/tests.py b/backend/external_data/tests.py deleted file mode 100644 index 7ce503c2..00000000 --- a/backend/external_data/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. -- GitLab From 8e6289b69e37a8a92462bf2c692625a32b7833e8 Mon Sep 17 00:00:00 2001 From: alancear Date: Thu, 30 May 2019 15:54:26 +0200 Subject: [PATCH 08/13] Currencies fonctionnel --- backend/external_data/admin.py | 29 ++----------------- .../management/commands/update_data.py | 10 +++---- .../external_data/migrations/0001_initial.py | 4 +-- backend/external_data/models.py | 4 +-- 4 files changed, 11 insertions(+), 36 deletions(-) diff --git a/backend/external_data/admin.py b/backend/external_data/admin.py index 95c34c08..0291c8be 100644 --- a/backend/external_data/admin.py +++ b/backend/external_data/admin.py @@ -1,31 +1,6 @@ from django.contrib import admin -from reversion_compare.admin import CompareVersionAdmin -from backend_app.models.abstract.versionedEssentialModule import ( - VersionedEssentialModule, -) -from external_data.models import externalDatainfoDate +from external_data.models import ExternalDataInfoDate -ALL_MODELS = [ - - externalDatainfoDate, - -] - -CLASSIC_MODELS = filter( - lambda m: not issubclass(m, VersionedEssentialModule), ALL_MODELS -) -VERSIONED_MODELS = filter(lambda m: issubclass(m, VersionedEssentialModule), ALL_MODELS) - -####### -# Register the models -####### - -for Model in CLASSIC_MODELS: - # Register the model in the admin in a standard way - admin.site.register(Model) - -for Model in VERSIONED_MODELS: - # Register the model in the admin with versioning - admin.site.register(Model, CompareVersionAdmin) +admin.site.register(ExternalDataInfoDate) diff --git a/backend/external_data/management/commands/update_data.py b/backend/external_data/management/commands/update_data.py index ca9ab116..c59089a9 100644 --- a/backend/external_data/management/commands/update_data.py +++ b/backend/external_data/management/commands/update_data.py @@ -4,7 +4,7 @@ import requests from datetime import date from backend_app.models.currency import Currency -from external_data.models import externalDatainfoDate +from external_data.models import ExternalDataInfoDate from django.core.management.base import BaseCommand, CommandError class Command(BaseCommand): @@ -32,10 +32,10 @@ class Command(BaseCommand): code=k, defaults={"one_EUR_in_this_currency": v }) - - externalDatainfoDate.objects.update_or_create( - update_date = date.today() - ) + # + # ExternalDataInfoDate.objects.create( + # update_date=date.today() + # ) for currency in Currency.objects.all(): logger.info(currency.code + " " + str(currency.one_EUR_in_this_currency)) diff --git a/backend/external_data/migrations/0001_initial.py b/backend/external_data/migrations/0001_initial.py index eebe88cd..85143626 100644 --- a/backend/external_data/migrations/0001_initial.py +++ b/backend/external_data/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.7 on 2019-05-30 12:12 +# Generated by Django 2.1.7 on 2019-05-30 13:29 from django.db import migrations, models @@ -12,7 +12,7 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='externalDatainfoDate', + name='ExternalDatainfoDate', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('update_date', models.DateField()), diff --git a/backend/external_data/models.py b/backend/external_data/models.py index ea9a5d25..aa3d56c4 100644 --- a/backend/external_data/models.py +++ b/backend/external_data/models.py @@ -2,6 +2,6 @@ from django.db import models from backend_app.models.abstract.base import BaseModel -# TODO change name -class externalDatainfoDate(BaseModel): + +class ExternalDataInfoDate(BaseModel): update_date = models.DateField() -- GitLab From c1afe84d852528832596b99ccbbd034efae5acef Mon Sep 17 00:00:00 2001 From: Florent Chehab Date: Sat, 1 Jun 2019 11:23:55 +0200 Subject: [PATCH 09/13] Cleaning --- .../migrations/0009_auto_20190527_1615.py | 82 ------------------- .../migrations/0010_auto_20190527_1647.py | 18 ---- .../migrations/0010_auto_20190601_1110.py | 56 +++++++++++++ .../migrations/0011_updatedatefixer.py | 23 ------ .../migrations/0012_delete_updatedatefixer.py | 16 ---- backend/backend_app/models/utcPartner.py | 6 +- backend/external_data/admin.py | 5 +- backend/external_data/apps.py | 2 +- .../management/commands/import_utc_data.py | 34 ++++---- .../management/commands/update_data.py | 28 +++---- .../external_data/migrations/0001_initial.py | 25 +++--- backend/external_data/models.py | 9 +- 12 files changed, 115 insertions(+), 189 deletions(-) delete mode 100644 backend/backend_app/migrations/0009_auto_20190527_1615.py delete mode 100644 backend/backend_app/migrations/0010_auto_20190527_1647.py create mode 100644 backend/backend_app/migrations/0010_auto_20190601_1110.py delete mode 100644 backend/backend_app/migrations/0011_updatedatefixer.py delete mode 100644 backend/backend_app/migrations/0012_delete_updatedatefixer.py diff --git a/backend/backend_app/migrations/0009_auto_20190527_1615.py b/backend/backend_app/migrations/0009_auto_20190527_1615.py deleted file mode 100644 index fc9104ea..00000000 --- a/backend/backend_app/migrations/0009_auto_20190527_1615.py +++ /dev/null @@ -1,82 +0,0 @@ -# Generated by Django 2.1.7 on 2019-05-27 14:15 - -import django.core.validators -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('backend_app', '0008_auto_20190525_1522'), - ] - - operations = [ - migrations.CreateModel( - name='UtcPartner', - fields=[ - ('utc_id', models.IntegerField(primary_key=True, serialize=False)), - ('univ_name', models.CharField(max_length=100)), - ('address1', models.CharField(max_length=250)), - ('address2', models.CharField(max_length=250)), - ('zipcode', models.CharField(max_length=15)), - ('iso_code', models.CharField(max_length=50)), - ('city', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='backend_app.City')), - ], - options={ - 'abstract': False, - }, - ), - migrations.AlterUniqueTogether( - name='specialty', - unique_together=set(), - ), - migrations.RemoveField( - model_name='specialty', - name='department', - ), - migrations.RemoveField( - model_name='offer', - name='university', - ), - migrations.AlterField( - model_name='coursefeedback', - name='adequation', - field=models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(-5), django.core.validators.MaxValueValidator(5)]), - ), - migrations.AlterField( - model_name='coursefeedback', - name='language_following_ease', - field=models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(-5), django.core.validators.MaxValueValidator(5)]), - ), - migrations.AlterField( - model_name='coursefeedback', - name='working_dose', - field=models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(-5), django.core.validators.MaxValueValidator(5)]), - ), - migrations.AlterField( - model_name='exchangefeedback', - name='academical_level_appreciation', - field=models.IntegerField(validators=[django.core.validators.MinValueValidator(-5), django.core.validators.MaxValueValidator(5)]), - ), - migrations.RemoveField( - model_name='offer', - name='specialties', - ), - migrations.AddField( - model_name='offer', - name='specialties', - field=models.CharField(max_length=300, null=True), - ), - migrations.DeleteModel( - name='Department', - ), - migrations.DeleteModel( - name='Specialty', - ), - migrations.AddField( - model_name='offer', - name='utc_parter', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='backend_app.UtcPartner'), - ), - ] diff --git a/backend/backend_app/migrations/0010_auto_20190527_1647.py b/backend/backend_app/migrations/0010_auto_20190527_1647.py deleted file mode 100644 index 868b4f89..00000000 --- a/backend/backend_app/migrations/0010_auto_20190527_1647.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.1.7 on 2019-05-27 14:47 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('backend_app', '0009_auto_20190527_1615'), - ] - - operations = [ - migrations.AlterField( - model_name='exchange', - name='student_minor', - field=models.CharField(max_length=7, null=True), - ), - ] diff --git a/backend/backend_app/migrations/0010_auto_20190601_1110.py b/backend/backend_app/migrations/0010_auto_20190601_1110.py new file mode 100644 index 00000000..f1abdbec --- /dev/null +++ b/backend/backend_app/migrations/0010_auto_20190601_1110.py @@ -0,0 +1,56 @@ +# Generated by Django 2.1.7 on 2019-06-01 09:10 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [("backend_app", "0009_auto_20190531_2007")] + + operations = [ + migrations.CreateModel( + name="UtcPartner", + fields=[ + ("utc_id", models.IntegerField(primary_key=True, serialize=False)), + ("univ_name", models.CharField(max_length=100)), + ("address1", models.CharField(max_length=250)), + ("address2", models.CharField(max_length=250)), + ("zipcode", models.CharField(max_length=15)), + ("iso_code", models.CharField(max_length=50)), + ( + "city", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="backend_app.City", + ), + ), + ], + options={"abstract": False}, + ), + migrations.AlterUniqueTogether(name="specialty", unique_together=set()), + migrations.RemoveField(model_name="specialty", name="department"), + migrations.RemoveField(model_name="offer", name="university"), + migrations.AlterField( + model_name="exchange", + name="student_minor", + field=models.CharField(max_length=7, null=True), + ), + migrations.RemoveField(model_name="offer", name="specialties"), + migrations.AddField( + model_name="offer", + name="specialties", + field=models.CharField(max_length=300, null=True), + ), + migrations.DeleteModel(name="Department"), + migrations.DeleteModel(name="Specialty"), + migrations.AddField( + model_name="offer", + name="utc_parter", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="backend_app.UtcPartner", + ), + ), + ] diff --git a/backend/backend_app/migrations/0011_updatedatefixer.py b/backend/backend_app/migrations/0011_updatedatefixer.py deleted file mode 100644 index a96fdcf3..00000000 --- a/backend/backend_app/migrations/0011_updatedatefixer.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 2.1.7 on 2019-05-27 16:11 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('backend_app', '0010_auto_20190527_1647'), - ] - - operations = [ - migrations.CreateModel( - name='updateDateFixer', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('update_date', models.DateField()), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/backend/backend_app/migrations/0012_delete_updatedatefixer.py b/backend/backend_app/migrations/0012_delete_updatedatefixer.py deleted file mode 100644 index 96ee0b42..00000000 --- a/backend/backend_app/migrations/0012_delete_updatedatefixer.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 2.1.7 on 2019-05-30 12:12 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('backend_app', '0011_updatedatefixer'), - ] - - operations = [ - migrations.DeleteModel( - name='updateDateFixer', - ), - ] diff --git a/backend/backend_app/models/utcPartner.py b/backend/backend_app/models/utcPartner.py index c52485e1..b88718db 100644 --- a/backend/backend_app/models/utcPartner.py +++ b/backend/backend_app/models/utcPartner.py @@ -1,4 +1,8 @@ -from backend_app.models.abstract.base import BaseModel, BaseModelSerializer, BaseModelViewSet +from backend_app.models.abstract.base import ( + BaseModel, + BaseModelSerializer, + BaseModelViewSet, +) from django.db import models from backend_app.models.city import City diff --git a/backend/external_data/admin.py b/backend/external_data/admin.py index 0291c8be..76c39386 100644 --- a/backend/external_data/admin.py +++ b/backend/external_data/admin.py @@ -1,6 +1,5 @@ from django.contrib import admin +from external_data.models import ExternalDataUpdateInfo -from external_data.models import ExternalDataInfoDate - -admin.site.register(ExternalDataInfoDate) +admin.site.register(ExternalDataUpdateInfo) diff --git a/backend/external_data/apps.py b/backend/external_data/apps.py index f63db719..52ee1511 100644 --- a/backend/external_data/apps.py +++ b/backend/external_data/apps.py @@ -2,4 +2,4 @@ from django.apps import AppConfig class ExternalDataConfig(AppConfig): - name = 'external_data' + name = "external_data" diff --git a/backend/external_data/management/commands/import_utc_data.py b/backend/external_data/management/commands/import_utc_data.py index 55f49b79..73e9cf40 100644 --- a/backend/external_data/management/commands/import_utc_data.py +++ b/backend/external_data/management/commands/import_utc_data.py @@ -10,15 +10,13 @@ from django.core.management.base import BaseCommand, CommandError class Command(BaseCommand): - help = 'Closes the specified poll for voting' + help = "Closes the specified poll for voting" # def add_arguments(self, parser): # parser.add_argument('poll_id', nargs='+', type=int) - def handle(self, *args, **options): logger = logging.getLogger("django") - os.environ["FIXER_API_TOKEN"] logger.info(os.environ["FIXER_API_TOKEN"]) logger.info("test") @@ -32,23 +30,25 @@ class Command(BaseCommand): print(exchange) try: - univ = University.objects.get(utc_id=exchange['idEtab']) + univ = University.objects.get(utc_id=exchange["idEtab"]) except University.DoesNotExist: - univ = University.objects.create(utc_id=exchange['idEtab']) + univ = University.objects.create(utc_id=exchange["idEtab"]) Exchange.objects.update_or_create( - utc_departure_id=exchange['idDepart'], - defaults={"utc_univ_id": univ, - "semester": exchange["semestreDepart"][0], - "year": exchange["semestreDepart"][1:], - "duration": exchange["duree"], - "dual_degree": exchange["doubleDiplome"], - "master_obtained": exchange["master"], - "student_major": exchange["specialite"], - "student_minor": exchange["option"], - "utc_allow_courses": exchange["autorisationTransfertUv"], - "utc_allow_login": exchange["autorisationTransfertLogin"], - }) + utc_departure_id=exchange["idDepart"], + defaults={ + "utc_univ_id": univ, + "semester": exchange["semestreDepart"][0], + "year": exchange["semestreDepart"][1:], + "duration": exchange["duree"], + "dual_degree": exchange["doubleDiplome"], + "master_obtained": exchange["master"], + "student_major": exchange["specialite"], + "student_minor": exchange["option"], + "utc_allow_courses": exchange["autorisationTransfertUv"], + "utc_allow_login": exchange["autorisationTransfertLogin"], + }, + ) for exchange in Exchange.objects.all(): logger.info("Départ : " + str(exchange.utc_departure_id)) diff --git a/backend/external_data/management/commands/update_data.py b/backend/external_data/management/commands/update_data.py index c59089a9..480f948f 100644 --- a/backend/external_data/management/commands/update_data.py +++ b/backend/external_data/management/commands/update_data.py @@ -1,41 +1,41 @@ import logging import os +from datetime import date + import requests +from django.core.management.base import BaseCommand -from datetime import date from backend_app.models.currency import Currency -from external_data.models import ExternalDataInfoDate -from django.core.management.base import BaseCommand, CommandError +from external_data.models import ExternalDataUpdateInfo + class Command(BaseCommand): - help = 'Closes the specified poll for voting' + help = "Closes the specified poll for voting" # def add_arguments(self, parser): # parser.add_argument('poll_id', nargs='+', type=int) def handle(self, *args, **options): logger = logging.getLogger("django") - os.environ["FIXER_API_TOKEN"] logger.info(os.environ["FIXER_API_TOKEN"]) key = os.environ["FIXER_API_TOKEN"] logger.info(key) logger.info("test") - response = requests.get("http://data.fixer.io/api/latest" + '?access_key=' + key) + response = requests.get( + "http://data.fixer.io/api/latest" + "?access_key=" + key + ) logger.info(response) logger = logging.getLogger("django") - for (k,v) in response.json()['rates'].items(): + for (k, v) in response.json()["rates"].items(): Currency.objects.update_or_create( - code=k, - defaults={"one_EUR_in_this_currency": v - }) - # - # ExternalDataInfoDate.objects.create( - # update_date=date.today() - # ) + code=k, defaults={"one_EUR_in_this_currency": v} + ) + + ExternalDataUpdateInfo.objects.create(source="fixer") for currency in Currency.objects.all(): logger.info(currency.code + " " + str(currency.one_EUR_in_this_currency)) diff --git a/backend/external_data/migrations/0001_initial.py b/backend/external_data/migrations/0001_initial.py index 85143626..42af1683 100644 --- a/backend/external_data/migrations/0001_initial.py +++ b/backend/external_data/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.7 on 2019-05-30 13:29 +# Generated by Django 2.1.7 on 2019-06-01 09:22 from django.db import migrations, models @@ -7,18 +7,23 @@ class Migration(migrations.Migration): initial = True - dependencies = [ - ] + dependencies = [] operations = [ migrations.CreateModel( - name='ExternalDatainfoDate', + name="ExternalDataUpdateInfo", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('update_date', models.DateField()), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("timestamp", models.DateTimeField(auto_now=True)), + ("source", models.CharField(max_length=50)), ], - options={ - 'abstract': False, - }, - ), + ) ] diff --git a/backend/external_data/models.py b/backend/external_data/models.py index aa3d56c4..f1b448fc 100644 --- a/backend/external_data/models.py +++ b/backend/external_data/models.py @@ -1,7 +1,8 @@ from django.db import models -from backend_app.models.abstract.base import BaseModel - -class ExternalDataInfoDate(BaseModel): - update_date = models.DateField() +class ExternalDataUpdateInfo(models.Model): + timestamp = models.DateTimeField(auto_now=True) + source = models.CharField( + max_length=50 + ) # Source identifier of the data that was updated -- GitLab From 8782f9d3901d94646b94e5893082994433b2515b Mon Sep 17 00:00:00 2001 From: Florent Chehab Date: Sat, 1 Jun 2019 12:06:10 +0200 Subject: [PATCH 10/13] Refacto and cleaning --- .../management/commands/_private.py | 0 .../management/commands/import_utc_data.py | 54 ----------------- .../management/commands/update_data.py | 41 ------------- .../commands/update_external_data.py | 60 +++++++++++++++++++ backend/external_data/views.py | 3 - 5 files changed, 60 insertions(+), 98 deletions(-) delete mode 100644 backend/external_data/management/commands/_private.py delete mode 100644 backend/external_data/management/commands/import_utc_data.py delete mode 100644 backend/external_data/management/commands/update_data.py create mode 100644 backend/external_data/management/commands/update_external_data.py delete mode 100644 backend/external_data/views.py diff --git a/backend/external_data/management/commands/_private.py b/backend/external_data/management/commands/_private.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/external_data/management/commands/import_utc_data.py b/backend/external_data/management/commands/import_utc_data.py deleted file mode 100644 index 73e9cf40..00000000 --- a/backend/external_data/management/commands/import_utc_data.py +++ /dev/null @@ -1,54 +0,0 @@ -import logging -import os -import requests - -from backend_app.models.exchange import Exchange -from backend_app.models.course import Course -from backend_app.models.university import University -from backend_app.models.utcPartner import UtcPartner -from django.core.management.base import BaseCommand, CommandError - - -class Command(BaseCommand): - help = "Closes the specified poll for voting" - - # def add_arguments(self, parser): - # parser.add_argument('poll_id', nargs='+', type=int) - - def handle(self, *args, **options): - logger = logging.getLogger("django") - logger.info(os.environ["FIXER_API_TOKEN"]) - logger.info("test") - - response = requests.get("http://10.83.255.117:8082/api/exchanges") - - logger.info(response) - - logger = logging.getLogger("django") - - for exchange in response.json()["content"]: - print(exchange) - - try: - univ = University.objects.get(utc_id=exchange["idEtab"]) - except University.DoesNotExist: - univ = University.objects.create(utc_id=exchange["idEtab"]) - - Exchange.objects.update_or_create( - utc_departure_id=exchange["idDepart"], - defaults={ - "utc_univ_id": univ, - "semester": exchange["semestreDepart"][0], - "year": exchange["semestreDepart"][1:], - "duration": exchange["duree"], - "dual_degree": exchange["doubleDiplome"], - "master_obtained": exchange["master"], - "student_major": exchange["specialite"], - "student_minor": exchange["option"], - "utc_allow_courses": exchange["autorisationTransfertUv"], - "utc_allow_login": exchange["autorisationTransfertLogin"], - }, - ) - - for exchange in Exchange.objects.all(): - logger.info("Départ : " + str(exchange.utc_departure_id)) diff --git a/backend/external_data/management/commands/update_data.py b/backend/external_data/management/commands/update_data.py deleted file mode 100644 index 480f948f..00000000 --- a/backend/external_data/management/commands/update_data.py +++ /dev/null @@ -1,41 +0,0 @@ -import logging -import os -from datetime import date - -import requests -from django.core.management.base import BaseCommand - -from backend_app.models.currency import Currency -from external_data.models import ExternalDataUpdateInfo - - -class Command(BaseCommand): - help = "Closes the specified poll for voting" - - # def add_arguments(self, parser): - # parser.add_argument('poll_id', nargs='+', type=int) - - def handle(self, *args, **options): - logger = logging.getLogger("django") - logger.info(os.environ["FIXER_API_TOKEN"]) - key = os.environ["FIXER_API_TOKEN"] - logger.info(key) - logger.info("test") - - response = requests.get( - "http://data.fixer.io/api/latest" + "?access_key=" + key - ) - - logger.info(response) - - logger = logging.getLogger("django") - - for (k, v) in response.json()["rates"].items(): - Currency.objects.update_or_create( - code=k, defaults={"one_EUR_in_this_currency": v} - ) - - ExternalDataUpdateInfo.objects.create(source="fixer") - - for currency in Currency.objects.all(): - logger.info(currency.code + " " + str(currency.one_EUR_in_this_currency)) diff --git a/backend/external_data/management/commands/update_external_data.py b/backend/external_data/management/commands/update_external_data.py new file mode 100644 index 00000000..36a7be81 --- /dev/null +++ b/backend/external_data/management/commands/update_external_data.py @@ -0,0 +1,60 @@ +import logging +import os + +import requests +from django.core.management.base import BaseCommand + +from backend_app.models.currency import Currency +from external_data.models import ExternalDataUpdateInfo + +FIXER_API_TOKEN = os.environ["FIXER_API_TOKEN"].strip() +logger = logging.getLogger("django") + + +class Command(BaseCommand): + help = "Command to handle updating remote data" + + def add_arguments(self, parser): + subparsers = parser.add_subparsers( + title="subcommands", dest="subcommand", required=False + ) + subparsers.add_parser("all", help="(default) Update all external data") + subparsers.add_parser("currencies", help="Update currencies from fixer") + + def handle(self, *args, **options): + if "subcommand" in options.keys(): + subcommand = options["subcommand"] + if subcommand == "all" or subcommand is None: + self.update_all() + elif options["subcommand"] == "currencies": + self.update_currencies() + else: + self.update_all() + + @staticmethod + def update_all(): + logger.info("Updating all external data") + Command.update_currencies() + + @staticmethod + def update_currencies(): + logger.info("Updating currencies") + response = requests.get( + "http://data.fixer.io/api/latest?access_key={}".format(FIXER_API_TOKEN) + ) + + data = response.json() + + if data["success"]: + for (code, rate) in response.json()["rates"].items(): + Currency.objects.update_or_create( + code=code, defaults={"one_EUR_in_this_currency": rate} + ) + ExternalDataUpdateInfo.objects.create(source="fixer") + logger.info("Currency update was successful") + + else: + logger.error( + "Updating currency information from fixer failed, see response from the API below." + ) + logger.error(response.json()) diff --git a/backend/external_data/views.py b/backend/external_data/views.py deleted file mode 100644 index 91ea44a2..00000000 --- a/backend/external_data/views.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. -- GitLab From d3eeca725a150ffc112b1727aa04ab573bd3ab1c Mon Sep 17 00:00:00 2001 From: Florent Chehab Date: Sat, 1 Jun 2019 12:17:53 +0200 Subject: [PATCH 11/13] Revert "Create UtcPartner model and delete Speciality and Department models" This reverts commit faf76fdbf737284ae4588cf0b1c9f90f9628d87d. --- backend/backend_app/admin.py | 4 +++ backend/backend_app/models/department.py | 27 ++++++++++++++++++++ backend/backend_app/models/exchange.py | 2 +- backend/backend_app/models/offer.py | 7 +++--- backend/backend_app/models/specialty.py | 32 ++++++++++++++++++++++++ backend/backend_app/models/utcPartner.py | 30 ---------------------- backend/backend_app/viewsets.py | 4 +++ 7 files changed, 72 insertions(+), 34 deletions(-) create mode 100644 backend/backend_app/models/department.py create mode 100644 backend/backend_app/models/specialty.py delete mode 100644 backend/backend_app/models/utcPartner.py diff --git a/backend/backend_app/admin.py b/backend/backend_app/admin.py index b3faa50b..14115388 100644 --- a/backend/backend_app/admin.py +++ b/backend/backend_app/admin.py @@ -15,12 +15,14 @@ from backend_app.models.countryTaggedItem import CountryTaggedItem from backend_app.models.course import Course from backend_app.models.courseFeedback import CourseFeedback from backend_app.models.currency import Currency +from backend_app.models.department import Department from backend_app.models.exchange import Exchange from backend_app.models.exchangeFeedback import ExchangeFeedback from backend_app.models.for_testing.moderation import ForTestingModeration from backend_app.models.for_testing.versioning import ForTestingVersioning from backend_app.models.offer import Offer from backend_app.models.pendingModeration import PendingModeration +from backend_app.models.specialty import Specialty from backend_app.models.tag import Tag from backend_app.models.university import University from backend_app.models.universityDri import UniversityDri @@ -43,10 +45,12 @@ ALL_MODELS = [ Course, CourseFeedback, Currency, + Department, Offer, PendingModeration, Exchange, ExchangeFeedback, + Specialty, Tag, University, UniversityDri, diff --git a/backend/backend_app/models/department.py b/backend/backend_app/models/department.py new file mode 100644 index 00000000..1669fd2d --- /dev/null +++ b/backend/backend_app/models/department.py @@ -0,0 +1,27 @@ +from django.db import models + +from backend_app.models.abstract.base import ( + BaseModel, + BaseModelSerializer, + BaseModelViewSet, +) +from backend_app.permissions.app_permissions import ReadOnly + + +class Department(BaseModel): + code = models.CharField(primary_key=True, max_length=6) + name = models.CharField(max_length=100) + active = models.BooleanField() + + +class DepartmentSerializer(BaseModelSerializer): + class Meta: + model = Department + fields = "__all__" + + +class DepartmentViewSet(BaseModelViewSet): + queryset = Department.objects.all() # pylint: disable=E1101 + serializer_class = DepartmentSerializer + permission_classes = (ReadOnly,) + end_point_route = "departments" diff --git a/backend/backend_app/models/exchange.py b/backend/backend_app/models/exchange.py index baced3a5..3c266593 100644 --- a/backend/backend_app/models/exchange.py +++ b/backend/backend_app/models/exchange.py @@ -18,7 +18,7 @@ class Exchange(BaseModel): dual_degree = models.BooleanField() master_obtained = models.BooleanField() student_major = models.CharField(max_length=20) - student_minor = models.CharField(max_length=7, null=True) + student_minor = models.CharField(max_length=7) student_option = models.CharField(max_length=7) utc_allow_courses = models.BooleanField() diff --git a/backend/backend_app/models/offer.py b/backend/backend_app/models/offer.py index 6ced19ac..0efa43d9 100644 --- a/backend/backend_app/models/offer.py +++ b/backend/backend_app/models/offer.py @@ -6,12 +6,13 @@ from backend_app.models.abstract.base import ( BaseModelViewSet, ) from backend_app.models.shared import SEMESTER_OPTIONS -from backend_app.models.utcPartner import UtcPartner +from backend_app.models.specialty import Specialty +from backend_app.models.university import University from backend_app.permissions.app_permissions import ReadOnly class Offer(BaseModel): - utc_parter = models.ForeignKey(UtcPartner, on_delete=models.PROTECT, null=True) + university = models.ForeignKey(University, on_delete=models.PROTECT) year = models.PositiveIntegerField(default=2018) semester = models.CharField(max_length=2, choices=SEMESTER_OPTIONS, default="a") @@ -20,7 +21,7 @@ class Offer(BaseModel): nb_seats_offered_exchange = models.PositiveIntegerField(null=True) nb_seats_offered_double_degree = models.PositiveIntegerField(null=True) - specialties = models.CharField(max_length=300, null=True) + specialties = models.ManyToManyField(Specialty, related_name="has_seats_at_univ") class OfferSerializer(BaseModelSerializer): diff --git a/backend/backend_app/models/specialty.py b/backend/backend_app/models/specialty.py new file mode 100644 index 00000000..7daaea6d --- /dev/null +++ b/backend/backend_app/models/specialty.py @@ -0,0 +1,32 @@ +from django.db import models + +from backend_app.models.abstract.base import ( + BaseModel, + BaseModelSerializer, + BaseModelViewSet, +) +from backend_app.models.department import Department +from backend_app.permissions.app_permissions import ReadOnly + + +class Specialty(BaseModel): + code = models.CharField(max_length=6) + department = models.ForeignKey(Department, on_delete=models.PROTECT) + name = models.CharField(max_length=100) + active = models.BooleanField() + + class Meta: + unique_together = ("code", "department") + + +class SpecialtySerializer(BaseModelSerializer): + class Meta: + model = Specialty + fields = "__all__" + + +class SpecialtyViewSet(BaseModelViewSet): + queryset = Specialty.objects.all() # pylint: disable=E1101 + serializer_class = SpecialtySerializer + permission_classes = (ReadOnly,) + end_point_route = "specialties" diff --git a/backend/backend_app/models/utcPartner.py b/backend/backend_app/models/utcPartner.py deleted file mode 100644 index b88718db..00000000 --- a/backend/backend_app/models/utcPartner.py +++ /dev/null @@ -1,30 +0,0 @@ -from backend_app.models.abstract.base import ( - BaseModel, - BaseModelSerializer, - BaseModelViewSet, -) -from django.db import models - -from backend_app.models.city import City - - -class UtcPartner(BaseModel): - utc_id = models.IntegerField(primary_key=True) - univ_name = models.CharField(max_length=100) - address1 = models.CharField(max_length=250) - address2 = models.CharField(max_length=250) - zipcode = models.CharField(max_length=15) - city = models.ForeignKey(City, on_delete=models.PROTECT) - iso_code = models.CharField(max_length=50) - - -class UtcPartnerSerializer(BaseModelSerializer): - class Meta: - model = UtcPartner - fields = BaseModelSerializer.Meta.fields + ("utc_id", "univ_name") - - -class UtcPartnerViewSet(BaseModelViewSet): - queryset = UtcPartner.objects.all() - serializer_class = UtcPartnerSerializer - end_point_route = "utc_partners" diff --git a/backend/backend_app/viewsets.py b/backend/backend_app/viewsets.py index 6842e1a2..3d694e1b 100644 --- a/backend/backend_app/viewsets.py +++ b/backend/backend_app/viewsets.py @@ -16,6 +16,7 @@ from backend_app.models.countryScholarship import CountryScholarshipViewSet from backend_app.models.countryTaggedItem import CountryTaggedItemViewSet from backend_app.models.courseFeedback import CourseFeedback from backend_app.models.currency import CurrencyViewSet +from backend_app.models.department import DepartmentViewSet from backend_app.models.exchangeFeedback import ExchangeFeedbackViewSet from backend_app.models.file_picture import FileViewSet, PictureViewSet from backend_app.models.for_testing.moderation import ForTestingModerationViewSet @@ -26,6 +27,7 @@ from backend_app.models.pendingModeration import ( PendingModerationViewSet, PendingModerationObjViewSet, ) +from backend_app.models.specialty import SpecialtyViewSet from backend_app.models.tag import TagViewSet from backend_app.models.university import UniversityViewSet from backend_app.models.universityDri import UniversityDriViewSet @@ -60,6 +62,7 @@ ALL_API_VIEWSETS = [ CountryTaggedItemViewSet, CourseFeedbackViewSet, CurrencyViewSet, + DepartmentViewSet, OfferViewSet, LanguageViewSet, PendingModerationViewSet, @@ -67,6 +70,7 @@ ALL_API_VIEWSETS = [ FileViewSet, PictureViewSet, ExchangeFeedbackViewSet, + SpecialtyViewSet, TagViewSet, UniversityViewSet, UniversityDriViewSet, -- GitLab From 0d5434550cb4f90af949621d003bf5a01b9cf26c Mon Sep 17 00:00:00 2001 From: Florent Chehab Date: Sat, 1 Jun 2019 12:24:34 +0200 Subject: [PATCH 12/13] Done --- .../migrations/0010_auto_20190601_1110.py | 56 ------------------- server/docker-compose.prod.yml | 2 +- 2 files changed, 1 insertion(+), 57 deletions(-) delete mode 100644 backend/backend_app/migrations/0010_auto_20190601_1110.py diff --git a/backend/backend_app/migrations/0010_auto_20190601_1110.py b/backend/backend_app/migrations/0010_auto_20190601_1110.py deleted file mode 100644 index f1abdbec..00000000 --- a/backend/backend_app/migrations/0010_auto_20190601_1110.py +++ /dev/null @@ -1,56 +0,0 @@ -# Generated by Django 2.1.7 on 2019-06-01 09:10 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [("backend_app", "0009_auto_20190531_2007")] - - operations = [ - migrations.CreateModel( - name="UtcPartner", - fields=[ - ("utc_id", models.IntegerField(primary_key=True, serialize=False)), - ("univ_name", models.CharField(max_length=100)), - ("address1", models.CharField(max_length=250)), - ("address2", models.CharField(max_length=250)), - ("zipcode", models.CharField(max_length=15)), - ("iso_code", models.CharField(max_length=50)), - ( - "city", - models.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, - to="backend_app.City", - ), - ), - ], - options={"abstract": False}, - ), - migrations.AlterUniqueTogether(name="specialty", unique_together=set()), - migrations.RemoveField(model_name="specialty", name="department"), - migrations.RemoveField(model_name="offer", name="university"), - migrations.AlterField( - model_name="exchange", - name="student_minor", - field=models.CharField(max_length=7, null=True), - ), - migrations.RemoveField(model_name="offer", name="specialties"), - migrations.AddField( - model_name="offer", - name="specialties", - field=models.CharField(max_length=300, null=True), - ), - migrations.DeleteModel(name="Department"), - migrations.DeleteModel(name="Specialty"), - migrations.AddField( - model_name="offer", - name="utc_parter", - field=models.ForeignKey( - null=True, - on_delete=django.db.models.deletion.PROTECT, - to="backend_app.UtcPartner", - ), - ), - ] diff --git a/server/docker-compose.prod.yml b/server/docker-compose.prod.yml index 094e62aa..545751c3 100644 --- a/server/docker-compose.prod.yml +++ b/server/docker-compose.prod.yml @@ -21,7 +21,7 @@ services: - ./uwsgi/:/usr/src/uwsgi/:ro - django_logs:/var/log/django - frontend_logs:/var/log/frontend - env_file: [./envs/db.env, ./envs/django.env] + env_file: [./envs/db.env, ./envs/django.env, ./envs/external_data.env] environment: WAIT_HOSTS: database:5432 # For the 'wait' script, so that we are sure the db is up and running ENV: PROD # make sure to be in prod env -- GitLab From 0e87d829baf55db08c7e27ce65f8e22aca1a7d25 Mon Sep 17 00:00:00 2001 From: Florent Chehab Date: Sat, 1 Jun 2019 13:19:31 +0200 Subject: [PATCH 13/13] Added doc --- .../Application/Backend/external_data.md | 43 +++++++++++++++++++ documentation/_sidebar.md | 1 + 2 files changed, 44 insertions(+) create mode 100644 documentation/Application/Backend/external_data.md diff --git a/documentation/Application/Backend/external_data.md b/documentation/Application/Backend/external_data.md new file mode 100644 index 00000000..378a63bb --- /dev/null +++ b/documentation/Application/Backend/external_data.md @@ -0,0 +1,43 @@ +External data +============= + +`REX-DRI` interacts with several external services to provide consistent and up-to-date data to the application. + +All the fetching of remote data is handled in a dedicated backend app: `external_data`. A command line interface has also been developed. Once connected to the backend app container, run: + +```bash +./manage.py update_external_data --help +``` + +```txt +usage: manage.py update_external_data [-h] [--version] [-v {0,1,2,3}] + [--settings SETTINGS] + [--pythonpath PYTHONPATH] [--traceback] + [--no-color] + {all,currencies} ... + +Command to handle updating remote data + +[...] + +subcommands: + {all,currencies} + all (default) Update all external data + currencies Update currencies from fixer +``` + + +## Currencies + +Currencies exchange rates are taken from [`fixer`](https://fixer.io/). You must provide a consistent API key in `server/envs/external_data.env` to be able to use the service properly. + +To trigger un update of currencies, run `./manage.py update_external_data currencies`. + + +## UTC + +TODO + +## Auto update + +TODO diff --git a/documentation/_sidebar.md b/documentation/_sidebar.md index 1d7da803..e5358d37 100644 --- a/documentation/_sidebar.md +++ b/documentation/_sidebar.md @@ -19,6 +19,7 @@ * [Data validation](Application/Backend/data_validation.md) * [Tags](Application/Backend/tags.md) * [API](Application/Backend/API.md) + * [External data](Application/Backend/external_data.md) * [Tests](Application/Backend/tests.md) * [Optimization](Application/Backend/optimization.md) -- GitLab