diff --git a/Makefile b/Makefile index 10d1246125558a215c060466ee9425bfda37d231..9e42f4e7dcb5312d183128eed2e7dd1619ceb71a 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ run_backend: generate_backend docs: - cd docs/UML && $(MAKE) all + cd docs && $(MAKE) all docs_clean: - cd docs/UML && $(MAKE) clean + cd docs && $(MAKE) clean diff --git a/backend/load_data/loading_scripts/loadCountries.py b/backend/load_data/loading_scripts/loadCountries.py index f7b9d468b74b7eb1c8c406a39a7afe9f6d38106f..9e22f8fb54ed59c0985732eed63096507e0e4ab8 100644 --- a/backend/load_data/loading_scripts/loadCountries.py +++ b/backend/load_data/loading_scripts/loadCountries.py @@ -1,4 +1,4 @@ -from backend.models.location import Country +from backend.models.country import Country import os import pandas as pd from .loadGeneric import LoadGeneric diff --git a/backend/load_data/loading_scripts/loadCurrencies.py b/backend/load_data/loading_scripts/loadCurrencies.py index 392b7cec0a5feb3ab1bcb92b4baf450261fd0689..ae70fc6954b32b51f44c077443f5655d66c4e34e 100644 --- a/backend/load_data/loading_scripts/loadCurrencies.py +++ b/backend/load_data/loading_scripts/loadCurrencies.py @@ -1,4 +1,4 @@ -from backend.models.location import Currency +from backend.models.currency import Currency import os import csv from .loadGeneric import LoadGeneric diff --git a/backend/load_data/loading_scripts/loadUniversities.py b/backend/load_data/loading_scripts/loadUniversities.py index 627fbb1c41d5369ad16080295d20206f928dc7cc..0d99eb3b453a2866e2b319fc118b6d79e7245b88 100644 --- a/backend/load_data/loading_scripts/loadUniversities.py +++ b/backend/load_data/loading_scripts/loadUniversities.py @@ -1,5 +1,7 @@ -from backend.models.location import City, Country -from backend.models.university import University, Campus +from backend.models.country import Country +from backend.models.city import City +from backend.models.university import University +from backend.models.campus import Campus import os import pandas as pd diff --git a/backend/migrations/0002_auto_20180909_1455.py b/backend/migrations/0002_auto_20180909_1455.py new file mode 100644 index 0000000000000000000000000000000000000000..99c82c463b9701dd803d0d07ae0b0377445737de --- /dev/null +++ b/backend/migrations/0002_auto_20180909_1455.py @@ -0,0 +1,48 @@ +# Generated by Django 2.0.3 on 2018-09-09 12:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('backend', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='campus', + name='importance_level', + field=models.CharField(choices=[('-', 'normal'), ('+', 'important'), ('++', 'IMPORTANT')], default='-', max_length=2), + ), + migrations.AddField( + model_name='countrydri', + name='importance_level', + field=models.CharField(choices=[('-', 'normal'), ('+', 'important'), ('++', 'IMPORTANT')], default='-', max_length=2), + ), + migrations.AddField( + model_name='countryscholarship', + name='importance_level', + field=models.CharField(choices=[('-', 'normal'), ('+', 'important'), ('++', 'IMPORTANT')], default='-', max_length=2), + ), + migrations.AddField( + model_name='universitydri', + name='importance_level', + field=models.CharField(choices=[('-', 'normal'), ('+', 'important'), ('++', 'IMPORTANT')], default='-', max_length=2), + ), + migrations.AddField( + model_name='universityinfo', + name='importance_level', + field=models.CharField(choices=[('-', 'normal'), ('+', 'important'), ('++', 'IMPORTANT')], default='-', max_length=2), + ), + migrations.AddField( + model_name='universityscholarship', + name='importance_level', + field=models.CharField(choices=[('-', 'normal'), ('+', 'important'), ('++', 'IMPORTANT')], default='-', max_length=2), + ), + migrations.AddField( + model_name='universitysemestersdates', + name='importance_level', + field=models.CharField(choices=[('-', 'normal'), ('+', 'important'), ('++', 'IMPORTANT')], default='-', max_length=2), + ), + ] diff --git a/backend/migrations/0003_auto_20180909_1547.py b/backend/migrations/0003_auto_20180909_1547.py new file mode 100644 index 0000000000000000000000000000000000000000..944681dffe1defda224a3349ffe827b5cb98331c --- /dev/null +++ b/backend/migrations/0003_auto_20180909_1547.py @@ -0,0 +1,74 @@ +# Generated by Django 2.0.3 on 2018-09-09 13:47 + +import backend.models.tools.jSONField +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('backend', '0002_auto_20180909_1455'), + ] + + operations = [ + migrations.AddField( + model_name='campustaggeditem', + name='comment', + field=models.TextField(blank=True), + ), + migrations.AddField( + model_name='campustaggeditem', + name='importance_level', + field=models.CharField(choices=[('-', 'normal'), ('+', 'important'), ('++', 'IMPORTANT')], default='-', max_length=2), + ), + migrations.AddField( + model_name='campustaggeditem', + name='usefull_links', + field=backend.models.tools.jSONField.JSONField(default=list), + ), + migrations.AddField( + model_name='citytaggeditem', + name='comment', + field=models.TextField(blank=True), + ), + migrations.AddField( + model_name='citytaggeditem', + name='importance_level', + field=models.CharField(choices=[('-', 'normal'), ('+', 'important'), ('++', 'IMPORTANT')], default='-', max_length=2), + ), + migrations.AddField( + model_name='citytaggeditem', + name='usefull_links', + field=backend.models.tools.jSONField.JSONField(default=list), + ), + migrations.AddField( + model_name='countrytaggeditem', + name='comment', + field=models.TextField(blank=True), + ), + migrations.AddField( + model_name='countrytaggeditem', + name='importance_level', + field=models.CharField(choices=[('-', 'normal'), ('+', 'important'), ('++', 'IMPORTANT')], default='-', max_length=2), + ), + migrations.AddField( + model_name='countrytaggeditem', + name='usefull_links', + field=backend.models.tools.jSONField.JSONField(default=list), + ), + migrations.AddField( + model_name='universitytaggeditem', + name='comment', + field=models.TextField(blank=True), + ), + migrations.AddField( + model_name='universitytaggeditem', + name='importance_level', + field=models.CharField(choices=[('-', 'normal'), ('+', 'important'), ('++', 'IMPORTANT')], default='-', max_length=2), + ), + migrations.AddField( + model_name='universitytaggeditem', + name='usefull_links', + field=backend.models.tools.jSONField.JSONField(default=list), + ), + ] diff --git a/backend/models/basic_module/__init__.py b/backend/models/basic_module/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e95855c1dbb5633b4887b1777f15c91ed88c06fa --- /dev/null +++ b/backend/models/basic_module/__init__.py @@ -0,0 +1 @@ +from .basicModule import BasicModule, BasicModuleSerializer, BasicModuleViewSet # noqa: F401 diff --git a/backend/models/module/basicModule.py b/backend/models/basic_module/basicModule.py similarity index 69% rename from backend/models/module/basicModule.py rename to backend/models/basic_module/basicModule.py index efa725cfdef690ca5e3fdf43f93d24fe0c0069e8..e370c2b95c656ae7eef63e0744c71a7f914075b4 100644 --- a/backend/models/module/basicModule.py +++ b/backend/models/basic_module/basicModule.py @@ -1,14 +1,25 @@ from django.db import models from backend.models.my_model import MyModelVersionned, MyModelVersionnedSerializer, MyModelVersionnedViewSet from backend.models.tools import JSONField -from backend.models.tag.tagged_item_validation import validate_content_against_config -from backend.models.tag.tags_config import USEFULL_LINKS_CONFIG +from backend.validators.tag import validate_content_against_config +from backend.validators.tag.tags_config import USEFULL_LINKS_CONFIG + +IMPORTANCE_LEVEL = ( + ('-', 'normal'), + ('+', 'important'), + ('++', 'IMPORTANT') +) class BasicModule(MyModelVersionned): comment = models.TextField(blank=True) usefull_links = JSONField(default=list) + importance_level = models.CharField( + max_length=2, + choices=IMPORTANCE_LEVEL, + default='-', + ) class Meta: abstract = True diff --git a/backend/models/campus/__init__.py b/backend/models/campus/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..1386dc508bda0b07fe8ca0be6d10305c94e0520e --- /dev/null +++ b/backend/models/campus/__init__.py @@ -0,0 +1,2 @@ +from .campus import Campus, CampusViewSet, CampusSerializer, MainCampusViewSet # noqa: F401 +from .campusTaggedItem import CampusTaggedItem, CampusTaggedItemSerializer, CampusTaggedItemViewSet # noqa: F401 diff --git a/backend/models/university/campus.py b/backend/models/campus/campus.py similarity index 93% rename from backend/models/university/campus.py rename to backend/models/campus/campus.py index 9daf759b490c776e502baff5857859516369bae9..ff45648c4f16fc3b43e1d392d9ed225cf5fa7ed7 100644 --- a/backend/models/university/campus.py +++ b/backend/models/campus/campus.py @@ -1,6 +1,6 @@ from django.db import models -from backend.models.module import BasicModule, BasicModuleSerializer, BasicModuleViewSet -from backend.models.location import City +from backend.models.basic_module import BasicModule, BasicModuleSerializer, BasicModuleViewSet +from backend.models.city import City from backend.models.university import University from django.core.validators import MinValueValidator, MaxValueValidator from backend.utils import get_model_config, get_viewset_permissions diff --git a/backend/models/university/campusTaggedItem.py b/backend/models/campus/campusTaggedItem.py similarity index 89% rename from backend/models/university/campusTaggedItem.py rename to backend/models/campus/campusTaggedItem.py index 6c984c252ed5ff3015219aaed1db7217bc58a5c3..659058b6bce0149ce4280eccbc8fea6a39df0fc9 100644 --- a/backend/models/university/campusTaggedItem.py +++ b/backend/models/campus/campusTaggedItem.py @@ -1,5 +1,5 @@ from django.db import models -from backend.models.university import Campus +from backend.models.campus import Campus from backend.models.tag import TaggedItem, TaggedItemSerializer, TaggedItemViewSet from backend.utils import get_model_config, get_viewset_permissions @@ -14,7 +14,7 @@ class CampusTaggedItem(TaggedItem): return CampusTaggedItemSerializer class Meta: - unique_together = ('campus', 'tag') + unique_together = ('campus', 'tag', 'importance_level') class CampusTaggedItemSerializer(TaggedItemSerializer): diff --git a/backend/models/city/__init__.py b/backend/models/city/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5a2cb1c26ff002b4bd78f222b83caa82953eb1a2 --- /dev/null +++ b/backend/models/city/__init__.py @@ -0,0 +1,2 @@ +from .city import City, CitySerializer, CityViewSet # noqa: F401 +from .cityTaggedItem import CityTaggedItem, CityTaggedItemSerializer, CityTaggedItemViewSet # noqa: F401 diff --git a/backend/models/location/city.py b/backend/models/city/city.py similarity index 95% rename from backend/models/location/city.py rename to backend/models/city/city.py index e662a92874b2c2aec42c348fb211de938b602df8..963c51d72ffdfb40b8869aef59ae0abc70ad4503 100644 --- a/backend/models/location/city.py +++ b/backend/models/city/city.py @@ -1,5 +1,5 @@ from django.db import models -from backend.models.location import Country +from backend.models.country import Country from backend.models.my_model import MyModel, MyModelSerializer, MyModelVersionnedViewSet from backend.utils import get_model_config, get_viewset_permissions diff --git a/backend/models/location/cityTaggedItem.py b/backend/models/city/cityTaggedItem.py similarity index 89% rename from backend/models/location/cityTaggedItem.py rename to backend/models/city/cityTaggedItem.py index 573d55aa84a53fa6dcd8b740519fa2d3959e3d56..8275ddd97b0f94025523d8bd907d2e9c2e2713b5 100644 --- a/backend/models/location/cityTaggedItem.py +++ b/backend/models/city/cityTaggedItem.py @@ -1,6 +1,6 @@ from django.db import models from backend.models.tag import TaggedItem, TaggedItemSerializer, TaggedItemViewSet -from backend.models.location import City +from backend.models.city import City from backend.utils import get_model_config, get_viewset_permissions @@ -15,7 +15,7 @@ class CityTaggedItem(TaggedItem): return CityTaggedItemSerializer class Meta: - unique_together = ('city', 'tag') + unique_together = ('city', 'tag', 'importance_level') class CityTaggedItemSerializer(TaggedItemSerializer): diff --git a/backend/models/location/__init__.py b/backend/models/country/__init__.py similarity index 58% rename from backend/models/location/__init__.py rename to backend/models/country/__init__.py index f1b0d81c5c19d3467a13e3d06f7b93834d62e20b..bef7faa117efb7c0fcb68ef816e7a19f31c3bb71 100644 --- a/backend/models/location/__init__.py +++ b/backend/models/country/__init__.py @@ -1,9 +1,4 @@ -from .currency import Currency, CurrencyViewSet, CurrencySerializer # noqa: F401 - from .country import Country, CountrySerializer, CountryViewSet # noqa: F401 from .countryScholarship import CountryScholarship, CountryScholarshipViewSet # noqa: F401 from .countryDri import CountryDri, CountryDriViewSet # noqa: F401 from .countryTaggedItem import CountryTaggedItem, CountryTaggedItemSerializer, CountryTaggedItemViewSet # noqa: F401 - -from .city import City, CitySerializer, CityViewSet # noqa: F401 -from .cityTaggedItem import CityTaggedItem, CityTaggedItemSerializer, CityTaggedItemViewSet # noqa: F401 diff --git a/backend/models/location/country.py b/backend/models/country/country.py similarity index 100% rename from backend/models/location/country.py rename to backend/models/country/country.py diff --git a/backend/models/location/countryDri.py b/backend/models/country/countryDri.py similarity index 64% rename from backend/models/location/countryDri.py rename to backend/models/country/countryDri.py index 81a7baa5d81fe4662f1b7033ffe43890ed45c43b..d3ff27f6da95eea17ce37dd51c17db97100504f4 100644 --- a/backend/models/location/countryDri.py +++ b/backend/models/country/countryDri.py @@ -1,10 +1,10 @@ from django.db import models -from backend.models.location import Country -from backend.models.module import DriRestrictedModule, DriRestrictedModuleSerializer, DriRestrictedModuleViewSet +from backend.models.country import Country +from backend.models.basic_module import BasicModule, BasicModuleSerializer, BasicModuleViewSet from backend.utils import get_model_config, get_viewset_permissions -class CountryDri(DriRestrictedModule): +class CountryDri(BasicModule): model_config = get_model_config("CountryDri") country = models.ManyToManyField( Country, related_name="country_dri") @@ -14,14 +14,14 @@ class CountryDri(DriRestrictedModule): return CountryDriSerializer -class CountryDriSerializer(DriRestrictedModuleSerializer): +class CountryDriSerializer(BasicModuleSerializer): class Meta: model = CountryDri fields = '__all__' -class CountryDriViewSet(DriRestrictedModuleViewSet): +class CountryDriViewSet(BasicModuleViewSet): permission_classes = get_viewset_permissions("CountryDriViewSet") queryset = CountryDri.objects.all() # pylint: disable=E1101 serializer_class = CountryDriSerializer diff --git a/backend/models/location/countryScholarship.py b/backend/models/country/countryScholarship.py similarity index 84% rename from backend/models/location/countryScholarship.py rename to backend/models/country/countryScholarship.py index b4439be2d333610a04e48cef60454195ae85a991..74f568276512a87cba989b371b2d4c5b18283cda 100644 --- a/backend/models/location/countryScholarship.py +++ b/backend/models/country/countryScholarship.py @@ -1,6 +1,6 @@ from django.db import models -from backend.models.location import Country -from backend.models.module import Scholarship, ScholarshipSerializer, ScholarshipViewSet +from backend.models.country import Country +from backend.models.scholarship import Scholarship, ScholarshipSerializer, ScholarshipViewSet from backend.utils import get_model_config, get_viewset_permissions diff --git a/backend/models/location/countryTaggedItem.py b/backend/models/country/countryTaggedItem.py similarity index 89% rename from backend/models/location/countryTaggedItem.py rename to backend/models/country/countryTaggedItem.py index c837138fbd70a22c69b19167887da6f6d53450a1..03bca29ba79b39488b82c9d42fee9e90b12feaf6 100644 --- a/backend/models/location/countryTaggedItem.py +++ b/backend/models/country/countryTaggedItem.py @@ -1,6 +1,6 @@ from django.db import models from backend.models.tag import TaggedItem, TaggedItemSerializer, TaggedItemViewSet -from backend.models.location import Country +from backend.models.country import Country from backend.utils import get_model_config, get_viewset_permissions @@ -14,7 +14,7 @@ class CountryTaggedItem(TaggedItem): return CountryTaggedItemSerializer class Meta: - unique_together = ('country', 'tag') + unique_together = ('country', 'tag', 'importance_level') class CountryTaggedItemSerializer(TaggedItemSerializer): diff --git a/backend/models/currency/__init__.py b/backend/models/currency/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..b686584e75dc5f497de65f225e4930fd3e6dc0d9 --- /dev/null +++ b/backend/models/currency/__init__.py @@ -0,0 +1 @@ +from .currency import Currency, CurrencyViewSet, CurrencySerializer # noqa: F401 diff --git a/backend/models/location/currency.py b/backend/models/currency/currency.py similarity index 100% rename from backend/models/location/currency.py rename to backend/models/currency/currency.py diff --git a/backend/models/module/__init__.py b/backend/models/module/__init__.py deleted file mode 100644 index 4f89a0ecab3034304a5e13106001d3accf0d696c..0000000000000000000000000000000000000000 --- a/backend/models/module/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .basicModule import BasicModule, BasicModuleSerializer, BasicModuleViewSet # noqa: F401 -from .scholarship import Scholarship, ScholarshipSerializer, ScholarshipViewSet # noqa: F401 -from .driRestrictedModule import DriRestrictedModule, DriRestrictedModuleSerializer, DriRestrictedModuleViewSet # noqa: F401 diff --git a/backend/models/module/driRestrictedModule.py b/backend/models/module/driRestrictedModule.py deleted file mode 100644 index 9fd29a3b28a19e541458a49e71f868edca23e034..0000000000000000000000000000000000000000 --- a/backend/models/module/driRestrictedModule.py +++ /dev/null @@ -1,16 +0,0 @@ -from backend.models.module import BasicModule, BasicModuleSerializer, BasicModuleViewSet - - -class DriRestrictedModule(BasicModule): - - class Meta: - abstract = True - - -class DriRestrictedModuleSerializer(BasicModuleSerializer): - class Meta: - model = DriRestrictedModule - - -class DriRestrictedModuleViewSet(BasicModuleViewSet): - serializer_class = DriRestrictedModuleSerializer diff --git a/backend/models/scholarship/__init__.py b/backend/models/scholarship/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..8fa452d2561eff68631638dd42a8a1ad55756edc --- /dev/null +++ b/backend/models/scholarship/__init__.py @@ -0,0 +1 @@ +from .scholarship import Scholarship, ScholarshipSerializer, ScholarshipViewSet # noqa: F401 diff --git a/backend/models/module/scholarship.py b/backend/models/scholarship/scholarship.py similarity index 83% rename from backend/models/module/scholarship.py rename to backend/models/scholarship/scholarship.py index 72bdc4c3a46b2d84d2d4f69324aca702e2f1ba3c..c7aacba98e94d6e1aa06fcf764a5ddfd78dac244 100644 --- a/backend/models/module/scholarship.py +++ b/backend/models/scholarship/scholarship.py @@ -1,6 +1,6 @@ from django.db import models -from backend.models.module import BasicModule, BasicModuleSerializer, BasicModuleViewSet -from backend.models.location import Currency +from backend.models.basic_module import BasicModule, BasicModuleSerializer, BasicModuleViewSet +from backend.models.currency import Currency from rest_framework import serializers from django.core.validators import MinValueValidator @@ -28,6 +28,7 @@ class Scholarship(BasicModule): class ScholarshipSerializer(BasicModuleSerializer): def my_validate(self, attrs): + attrs = super(ScholarshipSerializer, self).my_validate(attrs) if attrs['amount_max'] < attrs['amount_min']: raise serializers.ValidationError( "Amount_max should be greater or equal than amount_min") diff --git a/backend/models/tag/__init__.py b/backend/models/tag/__init__.py index cf2e066fedfe88cdbfeb8b09d4d2c743fe13cacb..c6976c63c2b8a7b91085481eb7671e7b27ec73d1 100644 --- a/backend/models/tag/__init__.py +++ b/backend/models/tag/__init__.py @@ -1,3 +1,2 @@ from .tag import Tag, TagSerializer, TagViewSet # noqa: F401 from .taggedItem import TaggedItem, TaggedItemSerializer, TaggedItemViewSet # noqa: F401 -from .tagged_item_validation import validate_content_against_config # noqa: F401 diff --git a/backend/models/tag/taggedItem.py b/backend/models/tag/taggedItem.py index e231252b7db5cb2bad25c2095e95537d98e10329..6993e1ba822ed2b016ef0c4dc4f24fa52f95aad3 100644 --- a/backend/models/tag/taggedItem.py +++ b/backend/models/tag/taggedItem.py @@ -1,11 +1,11 @@ from django.db import models -from backend.models.my_model import MyModelVersionned, MyModelVersionnedSerializer, MyModelVersionnedViewSet +from backend.models.basic_module import BasicModule, BasicModuleSerializer, BasicModuleViewSet from .tag import Tag -from .tagged_item_validation import tagged_item_validation +from backend.validators.tag import tagged_item_validation from backend.models.tools import JSONField -class TaggedItem(MyModelVersionned): +class TaggedItem(BasicModule): tag = models.ForeignKey(Tag, related_name='+', on_delete=models.PROTECT) custom_content = JSONField(default=dict) @@ -13,13 +13,13 @@ class TaggedItem(MyModelVersionned): abstract = True -class TaggedItemSerializer(MyModelVersionnedSerializer): +class TaggedItemSerializer(BasicModuleSerializer): def my_validate(self, attrs): tagged_item_validation(attrs) return attrs -class TaggedItemViewSet(MyModelVersionnedViewSet): +class TaggedItemViewSet(BasicModuleViewSet): def extend_queryset(self): return self.mymodel_queryset.prefetch_related('tag') diff --git a/backend/models/university/__init__.py b/backend/models/university/__init__.py index 67c76c63b0eae8d1cc5bdaf44ac89d19bf56f855..3d8932950ba3198f58cf0b469f0022ca597d2068 100644 --- a/backend/models/university/__init__.py +++ b/backend/models/university/__init__.py @@ -6,6 +6,3 @@ from .universityInfo import UniversityInfo, UniversityInfoSerializer, University from .universitySemestersDates import UniversitySemestersDates, UniversitySemestersDatesSerializer, UniversitySemestersDatesViewSet # noqa: F401 from .universityModulesAPI import UniversityModulesViewSet # noqa: F401 from .universityTaggedItem import UniversityTaggedItem, UniversityTaggedItemSerializer, UniversityTaggedItemViewSet # noqa: F401 - -from .campus import Campus, CampusViewSet, CampusSerializer, MainCampusViewSet # noqa: F401 -from .campusTaggedItem import CampusTaggedItem, CampusTaggedItemSerializer, CampusTaggedItemViewSet # noqa: F401 diff --git a/backend/models/university/university.py b/backend/models/university/university.py index d17c8b80fc1687ae92fe8966ff36577ca92eb0b8..a3389f953efc18e17cd0ef505647a148c6a4b220 100644 --- a/backend/models/university/university.py +++ b/backend/models/university/university.py @@ -3,7 +3,7 @@ from backend.models.my_model import MyModel from backend.utils import get_model_config from django.core.exceptions import ValidationError from rest_framework.validators import ValidationError as RFValidationError -from backend.models.tag.validators.url import validate_extension +from backend.validators.tag.url import validate_extension from django.conf import settings from backend.models.my_model import MyModelSerializer, MyModelViewSet from backend.utils import get_viewset_permissions diff --git a/backend/models/university/universityDri.py b/backend/models/university/universityDri.py index 743355c877672444ccf617a7b2501195c0539511..da8e0a4a63f24a6fd55baf0efab326c8fe8d5272 100644 --- a/backend/models/university/universityDri.py +++ b/backend/models/university/universityDri.py @@ -1,10 +1,10 @@ from django.db import models from backend.models.university import University -from backend.models.module import DriRestrictedModule, DriRestrictedModuleSerializer, DriRestrictedModuleViewSet +from backend.models.basic_module import BasicModule, BasicModuleSerializer, BasicModuleViewSet from backend.utils import get_model_config, get_viewset_permissions -class UniversityDri(DriRestrictedModule): +class UniversityDri(BasicModule): model_config = get_model_config("UniversityDri") university = models.ManyToManyField( University, related_name="university_dri") @@ -14,14 +14,14 @@ class UniversityDri(DriRestrictedModule): return UniversityDriSerializer -class UniversityDriSerializer(DriRestrictedModuleSerializer): +class UniversityDriSerializer(BasicModuleSerializer): class Meta: model = UniversityDri fields = '__all__' -class UniversityDriViewSet(DriRestrictedModuleViewSet): +class UniversityDriViewSet(BasicModuleViewSet): permission_classes = get_viewset_permissions("UniversityDriViewSet") queryset = UniversityDri.objects.all() # pylint: disable=E1101 serializer_class = UniversityDriSerializer diff --git a/backend/models/university/universityInfo.py b/backend/models/university/universityInfo.py index 71abb9a0b226a523a02539e4c01f7f63e8f8892f..65b561bffccc4569c13cb5c2c696b62967004e63 100644 --- a/backend/models/university/universityInfo.py +++ b/backend/models/university/universityInfo.py @@ -1,7 +1,7 @@ from django.db import models -from backend.models.module import BasicModule, BasicModuleSerializer, BasicModuleViewSet +from backend.models.basic_module import BasicModule, BasicModuleSerializer, BasicModuleViewSet from backend.models.university import University -from backend.models.location import Currency +from backend.models.currency import Currency from django.core.validators import MinValueValidator from backend.utils import get_model_config, get_viewset_permissions diff --git a/backend/models/university/universityModulesAPI.py b/backend/models/university/universityModulesAPI.py index a13114460b041d49bfe2c6a55f5c79f44c77c698..5fe4d96358cf6f4f114caf6b5e86f2fa239c02e3 100644 --- a/backend/models/university/universityModulesAPI.py +++ b/backend/models/university/universityModulesAPI.py @@ -1,5 +1,5 @@ from backend.models.university import University -from backend.models.university.campus import CampusSerializer +from backend.models.campus import CampusSerializer from backend.models.university import UniversityDriSerializer from backend.models.my_model import MyModelSerializer, MyModelViewSet diff --git a/backend/models/university/universityScholarship.py b/backend/models/university/universityScholarship.py index 7dda068f0b0e439a4fcd888e3a1337144f27b422..7f43b4573202bbfc6dee776edb853b6e370f7bc5 100644 --- a/backend/models/university/universityScholarship.py +++ b/backend/models/university/universityScholarship.py @@ -1,6 +1,6 @@ from django.db import models from backend.models.university import University -from backend.models.module import Scholarship, ScholarshipSerializer, ScholarshipViewSet +from backend.models.scholarship import Scholarship, ScholarshipSerializer, ScholarshipViewSet from backend.utils import get_model_config, get_viewset_permissions diff --git a/backend/models/university/universitySemestersDates.py b/backend/models/university/universitySemestersDates.py index c6ebebf26770dba356c4d321f0e909967dd8e332..ce2024df4d6cfeaec01e35cac2713267ce052de7 100644 --- a/backend/models/university/universitySemestersDates.py +++ b/backend/models/university/universitySemestersDates.py @@ -1,5 +1,5 @@ from django.db import models -from backend.models.module import BasicModule, BasicModuleSerializer, BasicModuleViewSet +from backend.models.basic_module import BasicModule, BasicModuleSerializer, BasicModuleViewSet from backend.models.university import University from rest_framework import serializers from backend.utils import get_model_config, get_viewset_permissions @@ -29,6 +29,8 @@ class UniversitySemestersDates(BasicModule): class UniversitySemestersDatesSerializer(BasicModuleSerializer): def my_validate(self, attrs): + attrs = super(UniversitySemestersDatesSerializer, self).my_validate(attrs) + s_b, s_e = attrs['spring_begin'], attrs['spring_end'] a_b, a_e = attrs['autumn_begin'], attrs['autumn_end'] diff --git a/backend/models/university/universityTaggedItem.py b/backend/models/university/universityTaggedItem.py index c8f1187ba6e86fd694cbcf7552bf148c71780157..8a3419a5e0263c93d46e0d907aed79cc7dc7472f 100644 --- a/backend/models/university/universityTaggedItem.py +++ b/backend/models/university/universityTaggedItem.py @@ -14,7 +14,7 @@ class UniversityTaggedItem(TaggedItem): return UniversityTaggedItemSerializer class Meta: - unique_together = ('university', 'tag') + unique_together = ('university', 'tag', 'importance_level') class UniversityTaggedItemSerializer(TaggedItemSerializer): diff --git a/backend/tests/test_scholarhip_validate.py b/backend/tests/test_scholarhip_validate.py index b91ef84a76a2b5d57c26c2eb602db550b8a7c644..0901a314110aadbed1a4da5dcfa12768fcc231a1 100644 --- a/backend/tests/test_scholarhip_validate.py +++ b/backend/tests/test_scholarhip_validate.py @@ -1,5 +1,5 @@ from django.test import TestCase -from backend.models.module.scholarship import ScholarshipSerializer +from backend.models.scholarship import ScholarshipSerializer import pytest from rest_framework.validators import ValidationError @@ -8,15 +8,15 @@ class ScholarshipTestCase(TestCase): def test_scholarhip_validation(self): ser = ScholarshipSerializer() + attrs = { + 'usefull_links': [], + 'comment': '' + } with pytest.raises(ValidationError): - attrs = { - 'amount_max': 100, - 'amount_min': 200 - } + attrs['amount_min'] = 200 + attrs['amount_max'] = 100 ser.my_validate(attrs) - attrs = { - 'amount_max': 200, - 'amount_min': 100 - } + attrs['amount_min'] = 100 + attrs['amount_max'] = 200 ser.my_validate(attrs) diff --git a/backend/tests/test_semester_dates_validate.py b/backend/tests/test_semester_dates_validate.py index 9d382227b7c1710bceb62a91351c151e5fa290c9..b52a9a39eb3c6bbfae664b7bbdd9463b40a7a766 100644 --- a/backend/tests/test_semester_dates_validate.py +++ b/backend/tests/test_semester_dates_validate.py @@ -11,7 +11,10 @@ class SemesterDatesTestCase(TestCase): def test_validation(self): def build(l): - return {sem: val for sem, val in zip(semesters, l)} + tmp = {sem: val for sem, val in zip(semesters, l)} + tmp['comment'] = "" + tmp['usefull_links'] = [] + return tmp def _test_attrs_error(attrs): with pytest.raises(ValidationError): diff --git a/backend/tests/test_validation_url.py b/backend/tests/test_validation_url.py index 21cede96e3147443d4c172f8d6fe113dc5c6b5f8..3c6d8817af1842ada360c9240956a86f8234c897 100644 --- a/backend/tests/test_validation_url.py +++ b/backend/tests/test_validation_url.py @@ -2,7 +2,7 @@ from django.test import TestCase import pytest from rest_framework.validators import ValidationError as RFValidationError from django.core.validators import ValidationError as DJValidationError -from backend.models.tag.validators.url import validate_extension, validate_url +from backend.validators.tag.url import validate_extension, validate_url class ValidationUrlTestCase(TestCase): diff --git a/backend/validators/__init__.py b/backend/validators/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/backend/models/tag/validators/__init__.py b/backend/validators/tag/__init__.py similarity index 52% rename from backend/models/tag/validators/__init__.py rename to backend/validators/tag/__init__.py index 79010c219f90e94f3301ef6b33b19dda01e7df6b..954ca606da3420bfa59135b7a21201fe1a12afba 100644 --- a/backend/models/tag/validators/__init__.py +++ b/backend/validators/tag/__init__.py @@ -1,2 +1,3 @@ from .url import validate_url # noqa: F401 from .text import validate_text # noqa: F401 +from .tagged_item_validation import validate_content_against_config # noqa: F401 diff --git a/backend/models/tag/checks.py b/backend/validators/tag/checks.py similarity index 100% rename from backend/models/tag/checks.py rename to backend/validators/tag/checks.py diff --git a/backend/models/tag/tagged_item_validation.py b/backend/validators/tag/tagged_item_validation.py similarity index 95% rename from backend/models/tag/tagged_item_validation.py rename to backend/validators/tag/tagged_item_validation.py index 0babe5219cc6d8ba97494fc9df2fc8609b7ee7bf..023e3abb963a5d18815335430b6cb6b3396e3a41 100644 --- a/backend/models/tag/tagged_item_validation.py +++ b/backend/validators/tag/tagged_item_validation.py @@ -1,7 +1,8 @@ from .checks import check_required -from .validators import validate_url, validate_text +from .url import validate_url +from .text import validate_text from rest_framework.validators import ValidationError -from .tags_config import PHOTOS_TAG_GONFIG +from .tags_config import PHOTOS_TAG_CONFIG from .tags_config import USEFULL_LINKS_CONFIG @@ -29,7 +30,7 @@ def validate_content_against_config(config, content): elif field_type == 'text': validate_text(field_config, field_submitted) elif field_type == 'photos': - validate_content_against_config({"photos": PHOTOS_TAG_GONFIG}, { + validate_content_against_config({"photos": PHOTOS_TAG_CONFIG}, { "photos": field_submitted}) elif field_type == 'usefull_links': validate_content_against_config({"ul": USEFULL_LINKS_CONFIG}, { diff --git a/backend/models/tag/tags_config/__init__.py b/backend/validators/tag/tags_config/__init__.py similarity index 54% rename from backend/models/tag/tags_config/__init__.py rename to backend/validators/tag/tags_config/__init__.py index d859e5e46cb7dc8c9b5c7004eabe3bac6d4f2717..df2fc2cfcc4c67d9239e731b15bf6cadc8db2994 100644 --- a/backend/models/tag/tags_config/__init__.py +++ b/backend/validators/tag/tags_config/__init__.py @@ -1,2 +1,2 @@ -from .photos import PHOTOS_TAG_GONFIG # noqa: F401 +from .photos import PHOTOS_TAG_CONFIG # noqa: F401 from .usefull_links import USEFULL_LINKS_CONFIG # noqa: F401 diff --git a/backend/models/tag/tags_config/photos.py b/backend/validators/tag/tags_config/photos.py similarity index 97% rename from backend/models/tag/tags_config/photos.py rename to backend/validators/tag/tags_config/photos.py index b80d1881b0ed3329804346449f4a0fa6bb0b09ff..57e3648a8959b26d3fd5219bf37427ef9b01753b 100644 --- a/backend/models/tag/tags_config/photos.py +++ b/backend/validators/tag/tags_config/photos.py @@ -1,6 +1,6 @@ from django.conf import settings -PHOTOS_TAG_GONFIG = { +PHOTOS_TAG_CONFIG = { "type": "array", "required": True, "content": { diff --git a/backend/models/tag/tags_config/usefull_links.py b/backend/validators/tag/tags_config/usefull_links.py similarity index 100% rename from backend/models/tag/tags_config/usefull_links.py rename to backend/validators/tag/tags_config/usefull_links.py diff --git a/backend/models/tag/validators/text.py b/backend/validators/tag/text.py similarity index 100% rename from backend/models/tag/validators/text.py rename to backend/validators/tag/text.py diff --git a/backend/models/tag/validators/url.py b/backend/validators/tag/url.py similarity index 100% rename from backend/models/tag/validators/url.py rename to backend/validators/tag/url.py diff --git a/docs/UML/.gitignore b/docs/.gitignore similarity index 100% rename from docs/UML/.gitignore rename to docs/.gitignore diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..ea6f8e8f552e89a48a06e0eaa37630d5dbd21efa --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,35 @@ +all: + mkdir -p generated + ../manage.py graph_models backend --disable-fields -g \ + | tail -n +2 > generated/architecture.dot + dot -Tsvg generated/architecture.dot -o generated/architecture.svg + + + ../manage.py graph_models backend --disable-abstract-fields -g -I \ + MyModel,MyModelVersionned,BasicModule,Scholarship,UserRestrictedModule \ + | tail -n +2 > generated/abstract.dot + dot -Tsvg generated/abstract.dot -o generated/abstract.svg + + ../manage.py graph_models backend --disable-abstract-fields -g -I \ + Specialty,Offer,Semester,Department,University \ + | tail -n +2 > generated/core.dot + dot -Tsvg generated/core.dot -o generated/core.svg + + ../manage.py graph_models backend --disable-abstract-fields -g -I \ + University,UniversityScholarship,UniversityInfo,UniversitySemestersDates,UniversityTaggedItems,UniversityDri,Campus,CampusTaggedItems \ + | tail -n +2 > generated/university.dot + dot -Tsvg generated/university.dot -o generated/university.svg + + ../manage.py graph_models backend --disable-abstract-fields -g -I \ + Country,City,CountryTaggedItems,CityTaggedItems,CountryScholarship,CountryDri\ + | tail -n +2 > generated/location.dot + dot -Tsvg generated/location.dot -o generated/location.svg + + ../manage.py graph_models backend --disable-abstract-fields -g -I \ + RecommendationsList,Recommendation,UserData,PreviousDeparture,PreviousDepartureFeedback,Semester,University,Sepcialty\ + | tail -n +2 > generated/user.dot + dot -Tsvg generated/user.dot -o generated/user.svg +.PHONY: clean + +clean: + rm -rf generated/ diff --git a/docs/UML/Architecture.pu b/docs/UML/Architecture.pu deleted file mode 100644 index 01c356461b9b0d9c79fb0eaca5fee596d173f859..0000000000000000000000000000000000000000 --- a/docs/UML/Architecture.pu +++ /dev/null @@ -1,9 +0,0 @@ -@startuml - -!include my_model__module.pu -!include other_core.pu -!include location.pu -!include university.pu -!include UserFunctions.pu - -@enduml diff --git a/docs/UML/Makefile b/docs/UML/Makefile deleted file mode 100644 index d6f019dba870331b0ed9be5ca6acf80fd66e69d3..0000000000000000000000000000000000000000 --- a/docs/UML/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -TARGET=\ - generated/Architecture.svg \ - generated/other_core.svg \ - generated/university.svg \ - generated/my_model__module.svg \ - generated/location.svg \ - generated/UserFunctions.svg - - -all: $(TARGET) - -generated/%.svg: %.pu - mkdir -p generated/ - plantuml -tsvg -o $(abspath generated/) $< - -.PHONY: clean - -clean: - rm -rf generated/ diff --git a/docs/UML/UserFunctions.pu b/docs/UML/UserFunctions.pu deleted file mode 100644 index be6a2f473e0b705633045597556b3133243db8f0..0000000000000000000000000000000000000000 --- a/docs/UML/UserFunctions.pu +++ /dev/null @@ -1,63 +0,0 @@ -@startuml - -package UserFunctionalities #lightblue{ - - class UniversityCopy1 as "University" #red - class SpecialtyCopy1 as "Specialty" #red - class UserCopy1 as "User" #red - class SemesterCopy1 as "Semester" #red - - class RecommendationsList{ - + title : string - + public : bool - } - - class Recommendation{ - + order_in_list : integer - + comment : MD - + grade : int in [0,20] - } - - RecommendationsList "1"-right-"*" Recommendation - - UniversityCopy1 "*" -up- "*" RecommendationsList - SpecialtyCopy1 "1..n" -up- "*" RecommendationsList - UserCopy1 "1" -left- "*" RecommendationsList - UserCopy1 "1" -right- "*" Recommendation - note on link #white - User <-> Recommendation - Required to controll access - end note - - class PreviousDeparture{ - + is_anonymous : bool - + courses : JSON - + Utc_departure_id : int - } - - class PreviousDepartureFeedback{ - + adequation_comment : MD - + integration_comment : MD - + adequation_grade : integer - + adequation_grade : integer - + courses_and_courses_feedback : JSON - } - - PreviousDeparture "1" -right- "1" PreviousDepartureFeedback - - PreviousDeparture "*" -left- "1" UserCopy1 - PreviousDeparture "*" -up- "1" SpecialtyCopy1 - PreviousDeparture "*" -up- "1" UniversityCopy1 - PreviousDeparture "*" -up- "1..n" SemesterCopy1 - - class UserData{ - + contact_info : JSON - + contact_info_is_public : bool - + config : JSON - + other_data : JSON - - } - UserData "1"-up-"1" UserCopy1 -} - -@enduml \ No newline at end of file diff --git a/docs/UML/location.pu b/docs/UML/location.pu deleted file mode 100644 index 90a1ac65f3dea900ef5b2b8ae5f04b3f8842cab2..0000000000000000000000000000000000000000 --- a/docs/UML/location.pu +++ /dev/null @@ -1,45 +0,0 @@ -@startuml - -package location{ - class City #white { - + name : string - + local_name : string - + area : string - } - - class Country #white { - # iso_alpha2_code : string{2} - + name : string - + region_code : string{3} - + region_name : string - + sub_region_code : string{3} - + sub_region_name : string - + intermediate_region_code : string{3} - + intermediate_region_name : string - } - - City "*" -left-* Country - - - note "Countries are intially \n hardcoded in the db." as N2 - N2 .up. Country - - abstract class BasicModuleCopyLocation as "BasicModule" #red - class CountryDri - CountryDri -down-|> BasicModuleCopyLocation - - Country "*"-down-"*" CountryDri - - abstract class CountryTaggedItem - abstract class ScholarShipCopyCountry as "Scholarship" #red - - class ScholarshipCountry - - ScholarshipCountry -right-|> ScholarShipCopyCountry - ScholarshipCountry "*" -- "*" Country - CountryTaggedItem "*" -- "*" Country - - CityTaggedItem "*" -- "*" City - class CityTaggedItem -} -@enduml \ No newline at end of file diff --git a/docs/UML/my_model__module.pu b/docs/UML/my_model__module.pu deleted file mode 100644 index 56b40c72c5f3a16671dfc68f72dc08ba8e6cccea..0000000000000000000000000000000000000000 --- a/docs/UML/my_model__module.pu +++ /dev/null @@ -1,40 +0,0 @@ -@startuml - - -package my_model #lightgrey{ - - abstract class MyModel{ - + moderated_by : user - + moderated_on : date - + updated_by : user - + updated_on : date - } - - abstract class MyModelVersionned { - ---- - get_serializer() - } - - MyModelVersionned -up-|> MyModel -} - -package module #lightgrey{ - - - abstract class BasicModule{ - + comment : string - + usefull_links : JSON \n array of {url,description} - } - - abstract class ScholarShip{ - + type : string - + amount_min : float {currency} - + amount_max : float {currency} - } - - BasicModule -up-|> MyModelVersionned - ScholarShip -up-|> BasicModule -} - - -@enduml \ No newline at end of file diff --git a/docs/UML/other_core.pu b/docs/UML/other_core.pu deleted file mode 100644 index 9fa81aff278a2214bf103dc1f0baa75ddc9e96b0..0000000000000000000000000000000000000000 --- a/docs/UML/other_core.pu +++ /dev/null @@ -1,44 +0,0 @@ -@startuml - -package Core { - Class Offer { - + nb_seats_offered : int - } - - Class Semester{ - + code : string {key} - } - - Class Department{ - + code : string - + name : string - + active : bool - } - - Class Specialty { - + code : string - + name : string - + active : bool - } - - Offer "*" -down- "1" Semester - Offer "*" -left- "1..n" Specialty - Specialty "1..n" -left- "1" Department - - note "Initial data inserted in db." as N3 - Semester .. N3 - N3 .. Specialty - N3 .. Department - - - class UsefullLinks #green{ - + content : MD - } - - note right of UsefullLinks: It will be a dynamic page \n on the website - -} -' End of Core block -Offer "*" -right- "1" University - -@enduml \ No newline at end of file diff --git a/docs/UML/university.pu b/docs/UML/university.pu deleted file mode 100644 index 72309f66d8be288f699c76fc759962483cabda39..0000000000000000000000000000000000000000 --- a/docs/UML/university.pu +++ /dev/null @@ -1,65 +0,0 @@ -@startuml - -skinparam defaultFontName Inconsolata - - - -package universityP{ - - class University #wheat { - + name : string - + accronyme : string - + logo : image - + website : url - } - - - abstract class UniversityTaggedItem - abstract class ScholarShipCopyUniversity as "Scholarship" #red - - - class SemestersDates{ - + autumn_begin : date - + autumn_end : date - + spring_begin : date - + spring_end : date - } - - class UniversityInfo{ - + cost_exchange : float - + cost_double_degree : float - } - - abstract class Campus{ - + is_main_campus : bool - + name : string - + Comment : MD - + longitude : float - + latitude : float - } - class UniversityDri - - UniversityDri -down-|> BasicModuleCopyCore - - University "*"-down-"*" UniversityDri - - - class CampusTaggedItem - Campus -left- CampusTaggedItem - - - Campus "1..n" -- "1" University - - UniversityScholarship -down-|> ScholarShipCopyUniversity - - - - UniversityInfo "1" -down[bold,#green]- "1" University - SemestersDates "1" -down[bold,#green]- "1" University - UniversityTaggedItem "*" -down- "*" University - - UniversityScholarship "*" -down- "1" University -} -University "*" .right. "1" City - -@enduml diff --git a/docs/architecture.md b/docs/architecture.md index cb579d748ce1a3a64070494b5d1eb7d7373467f7..d399fc012a97b19f7c41f8407551d40656eb111a 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -4,11 +4,11 @@ Architecture Présentation de l'architecture du backend. Vue complète : -![Architecture](UML/generated/Architecture.svg) +![Architecture](generated/architecture.svg) Vue plus précise : -![other_core](UML/generated/other_core.svg) -![AbstractModules](UML/generated/university.svg) -![Architecture](UML/generated/location.svg) -![Architecture](UML/generated/my_model__module.svg) -![Architecture](UML/generated/UserFunctions.svg) \ No newline at end of file +![other_core](generated/abstract.svg) +![other_core](generated/core.svg) +![AbstractModules](generated/university.svg) +![Architecture](generated/location.svg) +![Architecture](generated/user.svg) \ No newline at end of file diff --git a/general/api/api_config.yml b/general/api/api_config.yml index 59757568e8a39a1cc9306fac87ada2891f41b531..f8629b1c21feedb1d56ef78c014bb9ebecd8dbd6 100644 --- a/general/api/api_config.yml +++ b/general/api/api_config.yml @@ -38,13 +38,13 @@ - model: Country viewset: CountryViewSet - import_location: location + import_location: country api_end_point: countries viewset_permission: IsStaffOrReadOnly - model: City viewset: CityViewSet - import_location: location + import_location: city api_end_point: cities moderation_level: 2 @@ -56,7 +56,7 @@ - model: Campus viewset: CampusViewSet - import_location: university + import_location: campus api_end_point: campuses versionned: true moderation_level: 2 @@ -80,7 +80,7 @@ - model: Currency viewset: CurrencyViewSet - import_location: location + import_location: currency api_end_point: currencies moderation_level: 2 viewset_permission: IsStaffOrReadOnly @@ -116,19 +116,19 @@ - model: CountryTaggedItem viewset: CountryTaggedItemViewSet - import_location: location + import_location: country api_end_point: countriesTaggedItems versionned: true - model: CountryScholarship viewset: CountryScholarshipViewSet - import_location: location + import_location: country api_end_point: countriesScholarships versionned: true - model: CountryDri viewset: CountryDriViewSet - import_location: location + import_location: country api_end_point: countriesDri viewset_permission: IsDriOrReadOnly versionned: true @@ -137,7 +137,7 @@ - model: CityTaggedItem viewset: CityTaggedItemViewSet - import_location: location + import_location: city api_end_point: citiesTaggedItems versionned: true @@ -185,13 +185,13 @@ - model: CampusTaggedItem viewset: CampusTaggedItemViewSet - import_location: university + import_location: campus api_end_point: campusesTaggedItems versionned: true - model: null viewset: MainCampusViewSet - import_location: university + import_location: campus api_end_point: mainCampuses read_only: true diff --git a/general/settings.py b/general/settings.py index 2102670a7781a02045b5dfe9d4537142b8f235cf..8e258bb9a915adb94a144e364039f062ecf9d54b 100644 --- a/general/settings.py +++ b/general/settings.py @@ -34,6 +34,7 @@ INSTALLED_APPS = [ 'rest_framework.authtoken', 'backend', 'frontend', + 'django_extensions', 'debug_toolbar', ] diff --git a/requirements.txt b/requirements.txt index 7762252c43e4e132d093980f7a7209d1b2db39dc..bb41b5b12e70ddfc7f894de5b8c9590e6feadc17 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,4 +19,5 @@ pytest-xdist==1.23.0 flake8 django-debug-toolbar==1.9.1 pandas -pyyaml \ No newline at end of file +pyyaml +git+https://github.com/FloChehab/django-extensions.git@30c1a807aeb985739358d70907496e98d1857abb#egg=django-extensions