diff --git a/.flake8 b/.flake8 index d2ed74347478193edfd577de73771c55fe30b3bb..e8172ec5fef165c6ba39c6e4e3489bf77afdae32 100644 --- a/.flake8 +++ b/.flake8 @@ -5,3 +5,4 @@ exclude = env/* node_modules/* backend/urls.py + backend/admin.py diff --git a/backend/admin.py b/backend/admin.py deleted file mode 100644 index 676ae5b0554b0fcccafde71e2a9a43b955f2a8ba..0000000000000000000000000000000000000000 --- a/backend/admin.py +++ /dev/null @@ -1 +0,0 @@ -raise Exception("This file should be automatically generated") \ No newline at end of file diff --git a/backend/generate/api_config.yml b/backend/generate/api_config.yml index 15c08667792476326f0487f4e88256880104f951..c02ea464e4b6198a8f92e58b43c27e0a33a934b4 100644 --- a/backend/generate/api_config.yml +++ b/backend/generate/api_config.yml @@ -1,8 +1,3 @@ -- model: Tag - viewset: TagViewSet - import_location: module - api_end_point: tag - - model: Country viewset: CountryViewSet import_location: location @@ -13,6 +8,35 @@ import_location: location api_end_point: city +- model: Tag + viewset: TagViewSet + import_location: module + api_end_point: tag + +- model: UniversityTaggedItem + viewset: UniversityTaggedItemViewSet + import_location: university + api_end_point: university_more_tmp + versionned: true + +- model: CampusTaggedItem + viewset: CampusTaggedItemViewSet + import_location: university + api_end_point: campus_more_tmp + versionned: true + +- model: CountryTaggedItem + viewset: CountryTaggedItemViewSet + import_location: location + api_end_point: country_more_tmp + versionned: true + +- model: CityTaggedItem + viewset: CityTaggedItemViewSet + import_location: location + api_end_point: city_more_tmp + versionned: true + - model: Currency viewset: CurrencyViewSet import_location: module @@ -38,77 +62,29 @@ import_location: otherCore api_end_point: other/offer -- model: CountryCulture - viewset: CountryCultureViewSet - import_location: location - api_end_point: country_more/culture - -- model: CountryHealthInsurance - viewset: CountryHealthInsuranceViewSet - import_location: location - api_end_point: country_more/health_insurance - -- model: CountryOtherInsurance - viewset: CountryOtherInsuranceViewSet - import_location: location - api_end_point: country_more/other_insurance - -- model: CountryTransport - viewset: CountryTransportViewSet - import_location: location - api_end_point: country_more/transport - -- model: CountryTourism - viewset: CountryTourismViewSet - import_location: location - api_end_point: country_more/tourism - -- model: CountryOtherStuff - viewset: CountryOtherStuffViewSet - import_location: location - api_end_point: country_more/other_stuff - -- model: CountryVisaAdministrative - viewset: CountryVisaAdministrativeViewSet - import_location: location - api_end_point: country_more/visa_administrative - - model: CountryPhoto viewset: CountryPhotoViewSet import_location: location api_end_point: country_more/photos + versionned: true - model: CountryScholarship viewset: CountryScholarshipViewSet import_location: location api_end_point: country_more/scholarship + versionned: true - model: CountryDri viewset: CountryDriViewSet import_location: location api_end_point: country_more/dri - - - -- model: CityTransport - viewset: CityTransportViewSet - import_location: location - api_end_point: city_more/transport - -- model: CityTourism - viewset: CityTourismViewSet - import_location: location - api_end_point: city_more/tourism - -- model: CityOtherStuff - viewset: CityOtherStuffViewSet - import_location: location - api_end_point: city_more/other_stuff + versionned: true - model: CityPhoto viewset: CityPhotoViewSet import_location: location api_end_point: city_more/photos + versionned: true - model: University @@ -120,8 +96,9 @@ viewset: CampusViewSet import_location: university api_end_point: campus + versionned: true -- model: Campus +- model: null viewset: MainCampusViewSet import_location: university api_end_point: main_campus @@ -131,79 +108,39 @@ viewset: UniversityScholarshipViewSet import_location: university api_end_point: university_more/scholarship + versionned: true - model: UniversityInfo viewset: UniversityInfoViewSet import_location: university api_end_point: university_more/info + versionned: true - model: UniversitySemestersDates viewset: UniversitySemestersDatesViewSet import_location: university api_end_point: university_more/semesters_dates - -- model: UniversityInsurance - viewset: UniversityInsuranceViewSet - import_location: university - api_end_point: university_more/insurance - -- model: UniversityCourses - viewset: UniversityCoursesViewSet - import_location: university - api_end_point: university_more/courses - -- model: UniversityCulture - viewset: UniversityCultureViewSet - import_location: university - api_end_point: university_more/culture + versionned: true - model: UniversityPhoto viewset: UniversityPhotoViewSet import_location: university api_end_point: university_more/photo - -- model: UniversityOtherStuff - viewset: UniversityOtherStuffViewSet - import_location: university - api_end_point: university_more/other_stuff - -- model: UniversitySpecialOffer - viewset: UniversitySpecialOfferViewSet - import_location: university - api_end_point: university_more/special_offer + versionned: true - model: UniversityDri viewset: UniversityDriViewSet import_location: university api_end_point: university_more/dri + versionned: true -- model: UniversityModules +- model: null viewset: UniversityModulesViewSet import_location: university api_end_point: university_more/all api_attr: (?P[0-9]+) api_name: university_details -- model: CampusTransport - viewset: CampusTransportViewSet - import_location: university - api_end_point: campus_more/transport - -- model: CampusAccommodation - viewset: CampusAccommodationViewSet - import_location: university - api_end_point: campus_more/accomodation - -- model: CampusCultureAndStudentLife - viewset: CampusCultureAndStudentLifeViewSet - import_location: university - api_end_point: campus_more/culture_and_sl - -- model: CampusOtherStuff - viewset: CampusOtherStuffViewSet - import_location: university - api_end_point: campus_more/other_tuff - - model: Recommendation viewset: RecommendationViewSet import_location: user @@ -241,6 +178,7 @@ api_end_point: version api_attr: (?P[0-9]+)/(?P[0-9A-Za-z]+) api_name: versions-list + ignore_in_admin: true - model: ForTestingModeration viewset: ForTestingModerationViewSet @@ -253,10 +191,4 @@ import_location: my_model api_end_point: test/versioning requires_testing: true - - -# requires_testing -# viewset -# import_location -# api_end_point -# api_attr \ No newline at end of file + # versionned: true don't put it here, it is manually handled with @register decorator diff --git a/backend/generate/generate_all.py b/backend/generate/generate_all.py index 3ef7c7fc6058a3f47cb79b99c16630079852a93b..7ee27490b883c833421e1eb87a2e9673e0aeb549 100644 --- a/backend/generate/generate_all.py +++ b/backend/generate/generate_all.py @@ -1,8 +1,8 @@ ##### # This python file is used to generate js files for redux -import os from django import template import yaml +from os.path import join, realpath, dirname ############ # Need to do this first so that Django template engine is working @@ -30,37 +30,39 @@ def write_file(file, data): the_file.write(data) -current_dir = os.path.dirname(os.path.realpath(__file__)) -templates_dir = current_dir + '/templates/' -saving_dir = os.path.realpath(current_dir + "/../") - -# if not os.path.exists(saving_dir): -# os.makedirs(saving_dir) - -templates = [ - 'urls', -] - -# API_BASE = "http://127.0.0.1:8000/api/" - -contexts = yaml.load(read_file(os.path.join(current_dir, 'api_config.yml'))) - - -# def convert(name): -# s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) -# return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).upper() - +def render_and_save(template_path, context, output_path): + t = template.Template(read_file(template_path)) + c = template.Context({'data': context}) + output = t.render(c) + write_file(output_path, output) -# for c in contexts: -# c['NAME'] = convert(c['name']) -# # print(contexts) +current_dir = dirname(realpath(__file__)) +templates_dir = current_dir + '/templates/' +saving_dir = realpath(current_dir + "/../") -for filename in templates: - t = template.Template( - read_file(os.path.join(templates_dir, filename + '.tpl'))) - c = template.Context({'data': contexts}) - output = t.render(c) +# API_BASE = "http://127.0.0.1:8000/api/" - write_file(os.path.join(saving_dir, filename + '.py'), output) +api_config = yaml.load(read_file(join(current_dir, 'api_config.yml'))) + +# Render urls.py +template_path = join(templates_dir, 'urls.tpl') +output_path = join(saving_dir, 'urls.py') +render_and_save(template_path, api_config, output_path) + +# Render admin.py +data = [] +for obj in api_config: + if 'model' in obj and obj['model']: + if 'requires_testing' in obj and obj['requires_testing']: + continue # we don't want testing models to be register in admin + if 'ignore_in_admin' in obj and obj['ignore_in_admin']: + continue + if 'versionned' not in obj: + obj['versionned'] = False + data.append(obj) + +template_path = join(templates_dir, 'admin.tpl') +output_path = join(saving_dir, 'admin.py') +render_and_save(template_path, data, output_path) diff --git a/backend/generate/templates/admin.tpl b/backend/generate/templates/admin.tpl new file mode 100644 index 0000000000000000000000000000000000000000..36e430882ca868b313c09447a2fc2a757129a16c --- /dev/null +++ b/backend/generate/templates/admin.tpl @@ -0,0 +1,45 @@ +{% autoescape off %} +# WARNING +# THIS FILE HAS BEEN AUTOMATICALLY GENERATED +# WITH /backend/generate/generate_all.py +# MODIFY THE FILE ABOVE IF YOUR NOT SATISFIED +# THIS WARNING DOESN'T APPLY TO .tpl FILES... + +from django.contrib import admin +from reversion_compare.admin import CompareVersionAdmin + +{% spaceless %} +{% for model in data %} +from backend.models.{{model.import_location}} import {{model.model}} +{% endfor %} +{% endspaceless %} + + + +CLASSIC_MODELS = [ +{% for model in data %}{% if not model.versionned %} + {{model.model}}, +{% endif %}{% endfor %} +] + +VERSIONNED_MODELS = [ +{% for model in data %}{% if model.versionned %} + {{model.model}}, +{% endif %}{% endfor %} +] + +for model in CLASSIC_MODELS: + admin.site.register(model) + try: + model.get_serializer() + raise Exception("CLASSIX MODEL SHOULDN'T have this method") + except AttributeError: + pass + +for model in VERSIONNED_MODELS: + admin.site.register(model, CompareVersionAdmin) + if (model.get_serializer().Meta.model != model): + raise Exception( + "Get_serializer configuration incorrect in", str(model)) + +{% endautoescape %} diff --git a/backend/migrations/0024_auto_20180829_1840.py b/backend/migrations/0024_auto_20180829_1840.py new file mode 100644 index 0000000000000000000000000000000000000000..b9a5ead7097f9e467b47e6349f52c50a2128fe33 --- /dev/null +++ b/backend/migrations/0024_auto_20180829_1840.py @@ -0,0 +1,410 @@ +# Generated by Django 2.0.3 on 2018-08-29 16:40 + +import backend.models.tools.usefullLinksField +from django.conf import settings +import django.contrib.postgres.fields.jsonb +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('backend', '0023_auto_20180829_1815'), + ] + + operations = [ + migrations.CreateModel( + name='CampusTaggedItem', + fields=[ + ('moderated_on', models.DateTimeField(null=True)), + ('updated_on', models.DateTimeField(null=True)), + ('comment', models.TextField(blank=True)), + ('usefull_links', backend.models.tools.usefullLinksField.UsefullLinksField(blank=True, default=[], validators=[backend.models.tools.usefullLinksField.validate_usefull_links])), + ('custom_content', django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict)), + ('campus', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, primary_key=True, related_name='city_items', serialize=False, to='backend.Campus')), + ('moderated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('tag', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='backend.Tag')), + ('updated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='CityTaggedItem', + fields=[ + ('moderated_on', models.DateTimeField(null=True)), + ('updated_on', models.DateTimeField(null=True)), + ('comment', models.TextField(blank=True)), + ('usefull_links', backend.models.tools.usefullLinksField.UsefullLinksField(blank=True, default=[], validators=[backend.models.tools.usefullLinksField.validate_usefull_links])), + ('custom_content', django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict)), + ('city', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, primary_key=True, related_name='city_items', serialize=False, to='backend.City')), + ('moderated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('tag', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='backend.Tag')), + ('updated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='CountryTaggedItem', + fields=[ + ('moderated_on', models.DateTimeField(null=True)), + ('updated_on', models.DateTimeField(null=True)), + ('comment', models.TextField(blank=True)), + ('usefull_links', backend.models.tools.usefullLinksField.UsefullLinksField(blank=True, default=[], validators=[backend.models.tools.usefullLinksField.validate_usefull_links])), + ('custom_content', django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict)), + ('country', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, primary_key=True, related_name='city_items', serialize=False, to='backend.Country')), + ('moderated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('tag', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='backend.Tag')), + ('updated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='UniversityTaggedItem', + fields=[ + ('moderated_on', models.DateTimeField(null=True)), + ('updated_on', models.DateTimeField(null=True)), + ('comment', models.TextField(blank=True)), + ('usefull_links', backend.models.tools.usefullLinksField.UsefullLinksField(blank=True, default=[], validators=[backend.models.tools.usefullLinksField.validate_usefull_links])), + ('custom_content', django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict)), + ('university', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, primary_key=True, related_name='city_items', serialize=False, to='backend.University')), + ('moderated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('tag', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='backend.Tag')), + ('updated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.RemoveField( + model_name='campusaccommodation', + name='campus', + ), + migrations.RemoveField( + model_name='campusaccommodation', + name='moderated_by', + ), + migrations.RemoveField( + model_name='campusaccommodation', + name='updated_by', + ), + migrations.RemoveField( + model_name='campuscultureandstudentlife', + name='campus', + ), + migrations.RemoveField( + model_name='campuscultureandstudentlife', + name='moderated_by', + ), + migrations.RemoveField( + model_name='campuscultureandstudentlife', + name='updated_by', + ), + migrations.RemoveField( + model_name='campusotherstuff', + name='campus', + ), + migrations.RemoveField( + model_name='campusotherstuff', + name='moderated_by', + ), + migrations.RemoveField( + model_name='campusotherstuff', + name='updated_by', + ), + migrations.RemoveField( + model_name='campustransport', + name='campus', + ), + migrations.RemoveField( + model_name='campustransport', + name='moderated_by', + ), + migrations.RemoveField( + model_name='campustransport', + name='updated_by', + ), + migrations.RemoveField( + model_name='cityotherstuff', + name='city', + ), + migrations.RemoveField( + model_name='cityotherstuff', + name='moderated_by', + ), + migrations.RemoveField( + model_name='cityotherstuff', + name='updated_by', + ), + migrations.RemoveField( + model_name='citytourism', + name='city', + ), + migrations.RemoveField( + model_name='citytourism', + name='moderated_by', + ), + migrations.RemoveField( + model_name='citytourism', + name='updated_by', + ), + migrations.RemoveField( + model_name='citytransport', + name='city', + ), + migrations.RemoveField( + model_name='citytransport', + name='moderated_by', + ), + migrations.RemoveField( + model_name='citytransport', + name='updated_by', + ), + migrations.RemoveField( + model_name='countryculture', + name='country', + ), + migrations.RemoveField( + model_name='countryculture', + name='moderated_by', + ), + migrations.RemoveField( + model_name='countryculture', + name='updated_by', + ), + migrations.RemoveField( + model_name='countryhealthinsurance', + name='country', + ), + migrations.RemoveField( + model_name='countryhealthinsurance', + name='moderated_by', + ), + migrations.RemoveField( + model_name='countryhealthinsurance', + name='updated_by', + ), + migrations.RemoveField( + model_name='countryotherinsurance', + name='country', + ), + migrations.RemoveField( + model_name='countryotherinsurance', + name='moderated_by', + ), + migrations.RemoveField( + model_name='countryotherinsurance', + name='updated_by', + ), + migrations.RemoveField( + model_name='countryotherstuff', + name='country', + ), + migrations.RemoveField( + model_name='countryotherstuff', + name='moderated_by', + ), + migrations.RemoveField( + model_name='countryotherstuff', + name='updated_by', + ), + migrations.RemoveField( + model_name='countrytourism', + name='country', + ), + migrations.RemoveField( + model_name='countrytourism', + name='moderated_by', + ), + migrations.RemoveField( + model_name='countrytourism', + name='updated_by', + ), + migrations.RemoveField( + model_name='countrytransport', + name='country', + ), + migrations.RemoveField( + model_name='countrytransport', + name='moderated_by', + ), + migrations.RemoveField( + model_name='countrytransport', + name='updated_by', + ), + migrations.RemoveField( + model_name='countryvisaadministrative', + name='country', + ), + migrations.RemoveField( + model_name='countryvisaadministrative', + name='moderated_by', + ), + migrations.RemoveField( + model_name='countryvisaadministrative', + name='updated_by', + ), + migrations.RemoveField( + model_name='universitycourses', + name='moderated_by', + ), + migrations.RemoveField( + model_name='universitycourses', + name='university', + ), + migrations.RemoveField( + model_name='universitycourses', + name='updated_by', + ), + migrations.RemoveField( + model_name='universityculture', + name='moderated_by', + ), + migrations.RemoveField( + model_name='universityculture', + name='university', + ), + migrations.RemoveField( + model_name='universityculture', + name='updated_by', + ), + migrations.RemoveField( + model_name='universityinsurance', + name='moderated_by', + ), + migrations.RemoveField( + model_name='universityinsurance', + name='university', + ), + migrations.RemoveField( + model_name='universityinsurance', + name='updated_by', + ), + migrations.RemoveField( + model_name='universityotherstuff', + name='moderated_by', + ), + migrations.RemoveField( + model_name='universityotherstuff', + name='university', + ), + migrations.RemoveField( + model_name='universityotherstuff', + name='updated_by', + ), + migrations.RemoveField( + model_name='universityspecialoffer', + name='moderated_by', + ), + migrations.RemoveField( + model_name='universityspecialoffer', + name='university', + ), + migrations.RemoveField( + model_name='universityspecialoffer', + name='updated_by', + ), + migrations.AddField( + model_name='campus', + name='custom_content', + field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict), + ), + migrations.AddField( + model_name='countrydri', + name='custom_content', + field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict), + ), + migrations.AddField( + model_name='countryscholarship', + name='custom_content', + field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict), + ), + migrations.AddField( + model_name='universitydri', + name='custom_content', + field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict), + ), + migrations.AddField( + model_name='universityinfo', + name='custom_content', + field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict), + ), + migrations.AddField( + model_name='universityscholarship', + name='custom_content', + field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict), + ), + migrations.AddField( + model_name='universitysemestersdates', + name='custom_content', + field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict), + ), + migrations.DeleteModel( + name='CampusAccommodation', + ), + migrations.DeleteModel( + name='CampusCultureAndStudentLife', + ), + migrations.DeleteModel( + name='CampusOtherStuff', + ), + migrations.DeleteModel( + name='CampusTransport', + ), + migrations.DeleteModel( + name='CityOtherStuff', + ), + migrations.DeleteModel( + name='CityTourism', + ), + migrations.DeleteModel( + name='CityTransport', + ), + migrations.DeleteModel( + name='CountryCulture', + ), + migrations.DeleteModel( + name='CountryHealthInsurance', + ), + migrations.DeleteModel( + name='CountryOtherInsurance', + ), + migrations.DeleteModel( + name='CountryOtherStuff', + ), + migrations.DeleteModel( + name='CountryTourism', + ), + migrations.DeleteModel( + name='CountryTransport', + ), + migrations.DeleteModel( + name='CountryVisaAdministrative', + ), + migrations.DeleteModel( + name='UniversityCourses', + ), + migrations.DeleteModel( + name='UniversityCulture', + ), + migrations.DeleteModel( + name='UniversityInsurance', + ), + migrations.DeleteModel( + name='UniversityOtherStuff', + ), + migrations.DeleteModel( + name='UniversitySpecialOffer', + ), + migrations.AlterUniqueTogether( + name='universitytaggeditem', + unique_together={('university', 'tag')}, + ), + migrations.AlterUniqueTogether( + name='countrytaggeditem', + unique_together={('country', 'tag')}, + ), + migrations.AlterUniqueTogether( + name='citytaggeditem', + unique_together={('city', 'tag')}, + ), + migrations.AlterUniqueTogether( + name='campustaggeditem', + unique_together={('campus', 'tag')}, + ), + ] diff --git a/backend/models/location/__init__.py b/backend/models/location/__init__.py index d982b719199daf1cd5bca6ede5e89cd40abe096b..2b4af1fa888d42ee0ba3d0483ce0ee74f341e3a3 100644 --- a/backend/models/location/__init__.py +++ b/backend/models/location/__init__.py @@ -1,18 +1,9 @@ from .country import Country, CountrySerializer, CountryViewSet # noqa: F401 -from .city import City, CitySerializer, CityViewSet # noqa: F401 - -from .countryBasicModules import CountryCulture, CountryCultureViewSet # noqa: F401 -from .countryBasicModules import CountryVisaAdministrative, CountryVisaAdministrativeViewSet # noqa: F401 -from .countryBasicModules import CountryHealthInsurance, CountryHealthInsuranceViewSet # noqa: F401 -from .countryBasicModules import CountryOtherInsurance, CountryOtherInsuranceViewSet # noqa: F401 -from .countryBasicModules import CountryTransport, CountryTransportViewSet # noqa: F401 -from .countryBasicModules import CountryTourism, CountryTourismViewSet # noqa: F401 -from .countryBasicModules import CountryOtherStuff, CountryOtherStuffViewSet # noqa: F401 from .countryPhoto import CountryPhoto, CountryPhotoViewSet # 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 .cityBasicModules import CityTransport, CityTransportViewSet # noqa: F401 -from .cityBasicModules import CityOtherStuff, CityOtherStuffViewSet # noqa: F401 -from .cityBasicModules import CityTourism, CityTourismViewSet # noqa: F401 +from .city import City, CitySerializer, CityViewSet # noqa: F401 from .cityPhoto import CityPhoto, CityPhotoViewSet # noqa: F401 +from .cityTaggedItem import CityTaggedItem, CityTaggedItemSerializer, CityTaggedItemViewSet # noqa: F401 diff --git a/backend/models/location/city.py b/backend/models/location/city.py index 593bd22abe721696f46b90c5e1ca6ad57aa328db..b70e7cd97decfc288eb1f07c749f753b70a791cf 100644 --- a/backend/models/location/city.py +++ b/backend/models/location/city.py @@ -13,11 +13,6 @@ class City(MyModel): country = models.ForeignKey(Country, on_delete=models.PROTECT) -""" -API RELATED STUFF BELLOW -""" - - class CitySerializer(MyModelSerializer): country_url = serializers.SerializerMethodField() diff --git a/backend/models/location/cityBasicModules.py b/backend/models/location/cityBasicModules.py deleted file mode 100644 index 18d1ea0d3c008529550a758c59906a16524077ae..0000000000000000000000000000000000000000 --- a/backend/models/location/cityBasicModules.py +++ /dev/null @@ -1,86 +0,0 @@ -from django.db import models -from backend.models.module import BasicModule, BasicModuleSerializer, BasicModuleViewSet -from backend.models.location import City - - -#################### -# CityTransport -################### - -class CityTransport(BasicModule): - city = models.OneToOneField( - City, on_delete=models.CASCADE, related_name='city_transport', primary_key=True) - - @classmethod - def get_serializer(cls): - return CityTransportSerializer - - -class CityTransportSerializer(BasicModuleSerializer): - class Meta: - model = CityTransport - fields = '__all__' - - -class CityTransportViewSet(BasicModuleViewSet): - - queryset = CityTransport.objects.all() # pylint: disable=E1101 - serializer_class = CityTransportSerializer - - -##################### -##################### - - -#################### -# CityTourism -################### - -class CityTourism(BasicModule): - city = models.OneToOneField( - City, on_delete=models.CASCADE, related_name='city_tourism', primary_key=True) - - @classmethod - def get_serializer(cls): - return CityTourismSerializer - - -class CityTourismSerializer(BasicModuleSerializer): - class Meta: - model = CityTourism - fields = '__all__' - - -class CityTourismViewSet(BasicModuleViewSet): - - queryset = CityTourism.objects.all() # pylint: disable=E1101 - serializer_class = CityTourismSerializer - - -##################### -##################### - - -#################### -# CityOtherStuff -################### - -class CityOtherStuff(BasicModule): - city = models.OneToOneField( - City, on_delete=models.CASCADE, related_name='city_other_stuff', primary_key=True) - - @classmethod - def get_serializer(cls): - return CityOtherStuffSerializer - - -class CityOtherStuffSerializer(BasicModuleSerializer): - class Meta: - model = CityOtherStuff - fields = '__all__' - - -class CityOtherStuffViewSet(BasicModuleViewSet): - - queryset = CityOtherStuff.objects.all() # pylint: disable=E1101 - serializer_class = CityOtherStuffSerializer diff --git a/backend/models/location/cityTaggedItem.py b/backend/models/location/cityTaggedItem.py new file mode 100644 index 0000000000000000000000000000000000000000..2a56e3ebd9eacfee255e0248df9138b4b3415972 --- /dev/null +++ b/backend/models/location/cityTaggedItem.py @@ -0,0 +1,29 @@ +from django.db import models +from backend.models.module import BasicModule, BasicModuleSerializer, BasicModuleViewSet +from backend.models.location import City +from backend.models.module import Tag + + +class CityTaggedItem(BasicModule): + city = models.OneToOneField( + City, on_delete=models.PROTECT, related_name='city_items', primary_key=True) + tag = models.ForeignKey(Tag, related_name='+', on_delete=models.PROTECT) + + @classmethod + def get_serializer(cls): + return CityTaggedItemSerializer + + class Meta: + unique_together = ('city', 'tag') + + +class CityTaggedItemSerializer(BasicModuleSerializer): + class Meta: + model = CityTaggedItem + fields = '__all__' + + +class CityTaggedItemViewSet(BasicModuleViewSet): + + queryset = CityTaggedItem.objects.all() # pylint: disable=E1101 + serializer_class = CityTaggedItemSerializer diff --git a/backend/models/location/countryBasicModules.py b/backend/models/location/countryBasicModules.py deleted file mode 100644 index 7c935f185692b4245fb2bc8c013c092465644cf5..0000000000000000000000000000000000000000 --- a/backend/models/location/countryBasicModules.py +++ /dev/null @@ -1,201 +0,0 @@ -from django.db import models -from backend.models.module import BasicModule, BasicModuleSerializer, BasicModuleViewSet -from backend.models.location import Country - - -#################### -# CountryVisaAdministrative -################### - -class CountryVisaAdministrative(BasicModule): - country = models.OneToOneField( - Country, on_delete=models.CASCADE, related_name='country_visa_administrative', primary_key=True) - - @classmethod - def get_serializer(cls): - return CountryVisaAdministrativeSerializer - - -class CountryVisaAdministrativeSerializer(BasicModuleSerializer): - class Meta: - model = CountryVisaAdministrative - fields = '__all__' - - -class CountryVisaAdministrativeViewSet(BasicModuleViewSet): - - queryset = CountryVisaAdministrative.objects.all() # pylint: disable=E1101 - serializer_class = CountryVisaAdministrativeSerializer - - -##################### -##################### - - -#################### -# CountryHealthInsurance -################### - - -class CountryHealthInsurance(BasicModule): - country = models.OneToOneField( - Country, on_delete=models.CASCADE, related_name='country_health_insurances', primary_key=True) - - @classmethod - def get_serializer(cls): - return CountryHealthInsuranceSerializer - - -class CountryHealthInsuranceSerializer(BasicModuleSerializer): - class Meta: - model = CountryHealthInsurance - fields = '__all__' - - -class CountryHealthInsuranceViewSet(BasicModuleViewSet): - - queryset = CountryHealthInsurance.objects.all() # pylint: disable=E1101 - serializer_class = CountryHealthInsuranceSerializer - -##################### -##################### - - -#################### -# Other Insurance -################### - - -class CountryOtherInsurance(BasicModule): - country = models.OneToOneField( - Country, on_delete=models.CASCADE, related_name='country_other_insurances', primary_key=True) - - @classmethod - def get_serializer(cls): - return CountryOtherInsuranceSerializer - - -class CountryOtherInsuranceSerializer(BasicModuleSerializer): - class Meta: - model = CountryOtherInsurance - fields = '__all__' - - -class CountryOtherInsuranceViewSet(BasicModuleViewSet): - - queryset = CountryOtherInsurance.objects.all() # pylint: disable=E1101 - serializer_class = CountryOtherInsuranceSerializer - -##################### -##################### - - -#################### -# CountryCulture -################### - -class CountryCulture(BasicModule): - country = models.OneToOneField( - Country, on_delete=models.CASCADE, related_name='country_culture', primary_key=True) - - @classmethod - def get_serializer(cls): - return CountryCultureSerializer - - -class CountryCultureSerializer(BasicModuleSerializer): - class Meta: - model = CountryCulture - fields = '__all__' - - -class CountryCultureViewSet(BasicModuleViewSet): - - queryset = CountryCulture.objects.all() # pylint: disable=E1101 - serializer_class = CountryCultureSerializer - -##################### -##################### - - -#################### -# CountryTransport -################### - -class CountryTransport(BasicModule): - country = models.OneToOneField( - Country, on_delete=models.CASCADE, related_name='country_transport', primary_key=True) - - @classmethod - def get_serializer(cls): - return CountryTransportSerializer - - -class CountryTransportSerializer(BasicModuleSerializer): - class Meta: - model = CountryTransport - fields = '__all__' - - -class CountryTransportViewSet(BasicModuleViewSet): - - queryset = CountryTransport.objects.all() # pylint: disable=E1101 - serializer_class = CountryTransportSerializer - - -##################### -##################### - - -#################### -# CountryTourism -################### - -class CountryTourism(BasicModule): - country = models.OneToOneField( - Country, on_delete=models.CASCADE, related_name='country_tourism', primary_key=True) - - @classmethod - def get_serializer(cls): - return CountryTourismSerializer - - -class CountryTourismSerializer(BasicModuleSerializer): - class Meta: - model = CountryTourism - fields = '__all__' - - -class CountryTourismViewSet(BasicModuleViewSet): - - queryset = CountryTourism.objects.all() # pylint: disable=E1101 - serializer_class = CountryTourismSerializer - - -##################### -##################### - - -#################### -# CountryOtherStuff -################### - -class CountryOtherStuff(BasicModule): - country = models.OneToOneField( - Country, on_delete=models.CASCADE, related_name='country_other_stuff', primary_key=True) - - @classmethod - def get_serializer(cls): - return CountryOtherStuffSerializer - - -class CountryOtherStuffSerializer(BasicModuleSerializer): - class Meta: - model = CountryOtherStuff - fields = '__all__' - - -class CountryOtherStuffViewSet(BasicModuleViewSet): - - queryset = CountryOtherStuff.objects.all() # pylint: disable=E1101 - serializer_class = CountryOtherStuffSerializer diff --git a/backend/models/location/countryTaggedItem.py b/backend/models/location/countryTaggedItem.py new file mode 100644 index 0000000000000000000000000000000000000000..6ba04d359ae4935bd27066401942975906cb1957 --- /dev/null +++ b/backend/models/location/countryTaggedItem.py @@ -0,0 +1,29 @@ +from django.db import models +from backend.models.module import BasicModule, BasicModuleSerializer, BasicModuleViewSet +from backend.models.location import Country +from backend.models.module import Tag + + +class CountryTaggedItem(BasicModule): + country = models.OneToOneField( + Country, on_delete=models.PROTECT, related_name='city_items', primary_key=True) + tag = models.ForeignKey(Tag, related_name='+', on_delete=models.PROTECT) + + @classmethod + def get_serializer(cls): + return CountryTaggedItemSerializer + + class Meta: + unique_together = ('country', 'tag') + + +class CountryTaggedItemSerializer(BasicModuleSerializer): + class Meta: + model = CountryTaggedItem + fields = '__all__' + + +class CountryTaggedItemViewSet(BasicModuleViewSet): + + queryset = CountryTaggedItem.objects.all() # pylint: disable=E1101 + serializer_class = CountryTaggedItemSerializer diff --git a/backend/models/module/basicModule.py b/backend/models/module/basicModule.py index a47630b81f87d5e24b50a861c24d20f4a1c5ed52..f045842dc2c13f5b63462af1d64618e7b3839e21 100644 --- a/backend/models/module/basicModule.py +++ b/backend/models/module/basicModule.py @@ -1,12 +1,14 @@ from django.db import models from backend.models.tools import UsefullLinksField from backend.models.my_model import MyModelVersionned, MyModelVersionnedSerializer, MyModelVersionnedViewSet +from django.contrib.postgres.fields import JSONField class BasicModule(MyModelVersionned): comment = models.TextField(blank=True) usefull_links = UsefullLinksField(blank=True) + custom_content = JSONField(blank=True, default=dict) class Meta: abstract = True diff --git a/backend/models/university/__init__.py b/backend/models/university/__init__.py index 52d036af0555a3884fa47c140d949f3f12f25851..ae17ff23fa2856665395d80f7509809b02d20724 100644 --- a/backend/models/university/__init__.py +++ b/backend/models/university/__init__.py @@ -1,22 +1,13 @@ from .university import University # noqa: F401 -from .campus import Campus, CampusViewSet, CampusSerializer, MainCampusViewSet # noqa: F401 from .universityAPI import UniversitySerializer, UniversityViewSet # noqa: F401 from .universityScholarship import UniversityScholarship, UniversityScholarshipSerializer, UniversityScholarshipViewSet # noqa: F401 from .universityDri import UniversityDri, UniversityDriSerializer, UniversityDriViewSet # noqa: F401 from .universityInfo import UniversityInfo, UniversityInfoSerializer, UniversityInfoViewSet # noqa: F401 from .universitySemestersDates import UniversitySemestersDates, UniversitySemestersDatesSerializer, UniversitySemestersDatesViewSet # noqa: F401 -from .universityBasicModules import UniversityInsurance, UniversityInsuranceSerializer, UniversityInsuranceViewSet # noqa: F401 -from .universityBasicModules import UniversityCourses, UniversityCoursesSerializer, UniversityCoursesViewSet # noqa: F401 -from .universityBasicModules import UniversityCulture, UniversityCultureSerializer, UniversityCultureViewSet # noqa: F401 -from .universityBasicModules import UniversityOtherStuff, UniversityOtherStuffSerializer, UniversityOtherStuffViewSet # noqa: F401 -from .universityBasicModules import UniversitySpecialOffer, UniversitySpecialOfferSerializer, UniversitySpecialOfferViewSet # noqa: F401 - -from .campusBasicModules import CampusAccommodation, CampusAccommodationSerializer, CampusAccommodationViewSet # noqa: F401 -from .campusBasicModules import CampusTransport, CampusTransportSerializer, CampusTransportViewSet # noqa: F401 -from .campusBasicModules import CampusCultureAndStudentLife, CampusCultureAndStudentLifeSerializer, CampusCultureAndStudentLifeViewSet # noqa: F401 -from .campusBasicModules import CampusOtherStuff, CampusOtherStuffSerializer, CampusOtherStuffViewSet # noqa: F401 - from .universityPhoto import UniversityPhoto, UniversityPhotoSerializer, UniversityPhotoViewSet # 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/campusBasicModules.py b/backend/models/university/campusBasicModules.py deleted file mode 100644 index 21a88c120cd355fb84b14c292974eafcf02fd5e4..0000000000000000000000000000000000000000 --- a/backend/models/university/campusBasicModules.py +++ /dev/null @@ -1,109 +0,0 @@ -from django.db import models -from backend.models.university import Campus -from backend.models.module import BasicModule, BasicModuleSerializer, BasicModuleViewSet - -#################### -# CultureAndStudentLife -################### - - -class CampusCultureAndStudentLife(BasicModule): - campus = models.OneToOneField( - Campus, on_delete=models.CASCADE, related_name='campus_culture_and_sl', primary_key=True) - - @classmethod - def get_serializer(cls): - return CampusCultureAndStudentLifeSerializer - - -class CampusCultureAndStudentLifeSerializer(BasicModuleSerializer): - class Meta: - model = CampusCultureAndStudentLife - fields = '__all__' - - -class CampusCultureAndStudentLifeViewSet(BasicModuleViewSet): - queryset = CampusCultureAndStudentLife.objects.all() # pylint: disable=E1101 - serializer_class = CampusCultureAndStudentLifeSerializer - -##################### -##################### - - -#################### -# CampusAccommodation -################### - -class CampusAccommodation(BasicModule): - campus = models.OneToOneField( - Campus, on_delete=models.CASCADE, related_name='campus_accomodation', primary_key=True) - - @classmethod - def get_serializer(cls): - return CampusAccommodationSerializer - - -class CampusAccommodationSerializer(BasicModuleSerializer): - class Meta: - model = CampusAccommodation - fields = '__all__' - - -class CampusAccommodationViewSet(BasicModuleViewSet): - queryset = CampusAccommodation.objects.all() # pylint: disable=E1101 - serializer_class = CampusAccommodationSerializer - -##################### -##################### - - -#################### -# Transport -################### - -class CampusTransport(BasicModule): - campus = models.OneToOneField( - Campus, on_delete=models.CASCADE, related_name='campus_transport', primary_key=True) - - @classmethod - def get_serializer(cls): - return CampusTransportSerializer - - -class CampusTransportSerializer(BasicModuleSerializer): - class Meta: - model = CampusTransport - fields = '__all__' - - -class CampusTransportViewSet(BasicModuleViewSet): - queryset = CampusTransport.objects.all() # pylint: disable=E1101 - serializer_class = CampusTransportSerializer - - -##################### -##################### - - -#################### -# OtherStuff -################### - -class CampusOtherStuff(BasicModule): - campus = models.OneToOneField( - Campus, on_delete=models.CASCADE, related_name='campus_other_stuff', primary_key=True) - - @classmethod - def get_serializer(cls): - return CampusOtherStuffSerializer - - -class CampusOtherStuffSerializer(BasicModuleSerializer): - class Meta: - model = CampusOtherStuff - fields = '__all__' - - -class CampusOtherStuffViewSet(BasicModuleViewSet): - queryset = CampusOtherStuff.objects.all() # pylint: disable=E1101 - serializer_class = CampusOtherStuffSerializer diff --git a/backend/models/university/campusTaggedItem.py b/backend/models/university/campusTaggedItem.py new file mode 100644 index 0000000000000000000000000000000000000000..2172af366d250204504ff44d42ba2b60cb4290f2 --- /dev/null +++ b/backend/models/university/campusTaggedItem.py @@ -0,0 +1,29 @@ +from django.db import models +from backend.models.module import BasicModule, BasicModuleSerializer, BasicModuleViewSet +from backend.models.university import Campus +from backend.models.module import Tag + + +class CampusTaggedItem(BasicModule): + campus = models.OneToOneField( + Campus, on_delete=models.PROTECT, related_name='city_items', primary_key=True) + tag = models.ForeignKey(Tag, related_name='+', on_delete=models.PROTECT) + + @classmethod + def get_serializer(cls): + return CampusTaggedItemSerializer + + class Meta: + unique_together = ('campus', 'tag') + + +class CampusTaggedItemSerializer(BasicModuleSerializer): + class Meta: + model = CampusTaggedItem + fields = '__all__' + + +class CampusTaggedItemViewSet(BasicModuleViewSet): + + queryset = CampusTaggedItem.objects.all() # pylint: disable=E1101 + serializer_class = CampusTaggedItemSerializer diff --git a/backend/models/university/universityBasicModules.py b/backend/models/university/universityBasicModules.py deleted file mode 100644 index 4f3b95dd6543fcda354269b1e816893c8a3eb5c3..0000000000000000000000000000000000000000 --- a/backend/models/university/universityBasicModules.py +++ /dev/null @@ -1,139 +0,0 @@ -from django.db import models -from backend.models.module import BasicModule, BasicModuleSerializer, BasicModuleViewSet -from backend.models.university import University - - -#################### -# Insurance -################### - - -class UniversityInsurance(BasicModule): - university = models.OneToOneField( - University, on_delete=models.CASCADE, related_name='university_insurances', primary_key=True) - - @classmethod - def get_serializer(cls): - return UniversityInsuranceSerializer - - -class UniversityInsuranceSerializer(BasicModuleSerializer): - class Meta: - model = UniversityInsurance - fields = '__all__' - - -class UniversityInsuranceViewSet(BasicModuleViewSet): - queryset = UniversityInsurance.objects.all() # pylint: disable=E1101 - serializer_class = UniversityInsuranceSerializer - -##################### -##################### - - -#################### -# Culture -################### - -class UniversityCulture(BasicModule): - university = models.OneToOneField( - University, on_delete=models.CASCADE, related_name='university_culture', primary_key=True) - - @classmethod - def get_serializer(cls): - return UniversityCultureSerializer - - -class UniversityCultureSerializer(BasicModuleSerializer): - class Meta: - model = UniversityCulture - fields = '__all__' - - -class UniversityCultureViewSet(BasicModuleViewSet): - queryset = UniversityCulture.objects.all() # pylint: disable=E1101 - serializer_class = UniversityCultureSerializer - -##################### -##################### - - -#################### -# Courses -################### - -class UniversityCourses(BasicModule): - university = models.OneToOneField( - University, on_delete=models.CASCADE, related_name='university_courses', primary_key=True) - - @classmethod - def get_serializer(cls): - return UniversityCoursesSerializer - - -class UniversityCoursesSerializer(BasicModuleSerializer): - class Meta: - model = UniversityCourses - fields = '__all__' - - -class UniversityCoursesViewSet(BasicModuleViewSet): - queryset = UniversityCourses.objects.all() # pylint: disable=E1101 - serializer_class = UniversityCoursesSerializer - - -##################### -##################### - - -#################### -# SpecialOffer -################### -# TODO clarify this - -class UniversitySpecialOffer(BasicModule): - university = models.OneToOneField( - University, on_delete=models.CASCADE, related_name='university_special_offer', primary_key=True) - - @classmethod - def get_serializer(cls): - return UniversitySpecialOfferSerializer - - -class UniversitySpecialOfferSerializer(BasicModuleSerializer): - class Meta: - model = UniversitySpecialOffer - fields = '__all__' - - -class UniversitySpecialOfferViewSet(BasicModuleViewSet): - queryset = UniversitySpecialOffer.objects.all() # pylint: disable=E1101 - serializer_class = UniversitySpecialOfferSerializer - - -##################### -##################### - - -#################### -# OtherStuff -################### - -class UniversityOtherStuff(BasicModule): - university = models.OneToOneField( - University, on_delete=models.CASCADE, related_name='university_other_stuff', primary_key=True) - - @classmethod - def get_serializer(cls): - return UniversityOtherStuffSerializer - - -class UniversityOtherStuffSerializer(BasicModuleSerializer): - class Meta: - model = UniversityOtherStuff - fields = '__all__' - - -class UniversityOtherStuffViewSet(BasicModuleViewSet): - queryset = UniversityOtherStuff.objects.all() # pylint: disable=E1101 - serializer_class = UniversityOtherStuffSerializer diff --git a/backend/models/university/universityTaggedItem.py b/backend/models/university/universityTaggedItem.py new file mode 100644 index 0000000000000000000000000000000000000000..0079d3b1ab0b3177cd2a8ce0d95d4caea8cb60ac --- /dev/null +++ b/backend/models/university/universityTaggedItem.py @@ -0,0 +1,29 @@ +from django.db import models +from backend.models.module import BasicModule, BasicModuleSerializer, BasicModuleViewSet +from backend.models.university import University +from backend.models.module import Tag + + +class UniversityTaggedItem(BasicModule): + university = models.OneToOneField( + University, on_delete=models.PROTECT, related_name='city_items', primary_key=True) + tag = models.ForeignKey(Tag, related_name='+', on_delete=models.PROTECT) + + @classmethod + def get_serializer(cls): + return UniversityTaggedItemSerializer + + class Meta: + unique_together = ('university', 'tag') + + +class UniversityTaggedItemSerializer(BasicModuleSerializer): + class Meta: + model = UniversityTaggedItem + fields = '__all__' + + +class UniversityTaggedItemViewSet(BasicModuleViewSet): + + queryset = UniversityTaggedItem.objects.all() # pylint: disable=E1101 + serializer_class = UniversityTaggedItemSerializer