diff --git a/Makefile b/Makefile index a1e30f17..0c8f7898 100644 --- a/Makefile +++ b/Makefile @@ -84,7 +84,7 @@ django_migrate: ## Run migrate from django container using $(compose) @docker-compose -f $(compose) run --rm django python manage.py migrate django_makemessages: ## Run ./manage.py makemessages $(compose) - @docker-compose -f $(compose) run --rm django python manage.py makemessages + @docker-compose -f $(compose) run --rm django python manage.py makemessages --all django_compilemessages: ## Run ./manage.py compilemessages $(compose) @docker-compose -f $(compose) run --rm django python manage.py compilemessages diff --git a/config/settings/base.py b/config/settings/base.py index 53589c99..45ba988e 100755 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -106,6 +106,7 @@ "wagtailmenus", "rest_framework", "widget_tweaks", + "django_celery_results", ] LOCAL_APPS = [ @@ -115,12 +116,13 @@ "infrastructure_directory", "education_directory", "policy_directory", - "disclosure_directory", + "event_directory", "blog", "freepage", "core", "usefulmodels", "location", + "institution", ] # https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps diff --git a/disclosure_directory/chkcsvfmt.fmt b/disclosure_directory/chkcsvfmt.fmt deleted file mode 100644 index 58cb3c22..00000000 --- a/disclosure_directory/chkcsvfmt.fmt +++ /dev/null @@ -1,32 +0,0 @@ -[Event] -data_required=True -type=String - -[Link] -data_required=False -type=String - -[Description] -data_required=False -type=String - -[Organization] -data_required=False -type=String - -[Start Date] -data_required=False -type=Date - -[End Date] -data_required=False -type=Date - -[Start Time] -data_required=False -type=String - -[End Time] -data_required=False -type=String - diff --git a/disclosure_directory/example_disclosure.csv b/disclosure_directory/example_disclosure.csv deleted file mode 100644 index d1d88eb2..00000000 --- a/disclosure_directory/example_disclosure.csv +++ /dev/null @@ -1,2 +0,0 @@ -Event,Link,Description,Organization,Start Date,End Date,Start Time,End Time -Seminário X,http://www.sem.com.br,Seminário XPTO,SciELO,27/07/2022,28/08/2022,07:30,14:30 \ No newline at end of file diff --git a/disclosure_directory/forms.py b/disclosure_directory/forms.py deleted file mode 100644 index 113afbce..00000000 --- a/disclosure_directory/forms.py +++ /dev/null @@ -1,31 +0,0 @@ -from wagtail.admin.forms import WagtailAdminModelForm - - -class DisclosureDirectoryForm(WagtailAdminModelForm): - - def save_all(self, user): - disclosure_direcotry = super().save(commit=False) - - if self.instance.pk is not None: - disclosure_direcotry.updated_by = user - else: - disclosure_direcotry.creator = user - - self.save() - - return disclosure_direcotry - - -class DisclosureDirectoryFileForm(WagtailAdminModelForm): - - def save_all(self, user): - disclosure_direcotry_file = super().save(commit=False) - - if self.instance.pk is not None: - disclosure_direcotry_file.updated_by = user - else: - disclosure_direcotry_file.creator = user - - self.save() - - return disclosure_direcotry_file diff --git a/disclosure_directory/migrations/0001_initial.py b/disclosure_directory/migrations/0001_initial.py deleted file mode 100644 index 04ecfb61..00000000 --- a/disclosure_directory/migrations/0001_initial.py +++ /dev/null @@ -1,51 +0,0 @@ -# Generated by Django 3.2.12 on 2022-07-11 08:22 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('wagtaildocs', '0012_uploadeddocument'), - ] - - operations = [ - migrations.CreateModel( - name='DisclosureDirectoryFile', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', models.DateTimeField(auto_now_add=True, verbose_name='Creation date')), - ('updated', models.DateTimeField(auto_now=True, verbose_name='Last update date')), - ('is_valid', models.BooleanField(blank=True, default=False, null=True, verbose_name='Is valid?')), - ('line_count', models.IntegerField(blank=True, default=0, null=True, verbose_name='Number of lines')), - ('attachment', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtaildocs.document', verbose_name='Attachement')), - ('creator', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='disclosuredirectoryfile_creator', to=settings.AUTH_USER_MODEL, verbose_name='Creator')), - ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='disclosuredirectoryfile_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Updater')), - ], - options={ - 'verbose_name_plural': 'Disclosure Directory Upload', - }, - ), - migrations.CreateModel( - name='DisclosureDirectory', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', models.DateTimeField(auto_now_add=True, verbose_name='Creation date')), - ('updated', models.DateTimeField(auto_now=True, verbose_name='Last update date')), - ('event', models.CharField(max_length=255, verbose_name='Event')), - ('link', models.URLField(verbose_name='Link')), - ('description', models.TextField(blank=True, max_length=255, null=True, verbose_name='Description')), - ('organization', models.TextField(max_length=255, verbose_name='Organization')), - ('creator', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='disclosuredirectory_creator', to=settings.AUTH_USER_MODEL, verbose_name='Creator')), - ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='disclosuredirectory_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Updater')), - ], - options={ - 'verbose_name_plural': 'Disclosure Directory', - }, - ), - ] diff --git a/disclosure_directory/migrations/0002_auto_20220728_1606.py b/disclosure_directory/migrations/0002_auto_20220728_1606.py deleted file mode 100644 index bec96267..00000000 --- a/disclosure_directory/migrations/0002_auto_20220728_1606.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 3.2.12 on 2022-07-28 16:06 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('disclosure_directory', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='disclosuredirectory', - name='end_date', - field=models.DateField(blank=True, max_length=255, null=True, verbose_name='End Date'), - ), - migrations.AddField( - model_name='disclosuredirectory', - name='end_time', - field=models.TimeField(blank=True, max_length=255, null=True, verbose_name='End Time'), - ), - migrations.AddField( - model_name='disclosuredirectory', - name='start_date', - field=models.DateField(blank=True, max_length=255, null=True, verbose_name='Start Date'), - ), - migrations.AddField( - model_name='disclosuredirectory', - name='start_time', - field=models.TimeField(blank=True, max_length=255, null=True, verbose_name='Start Time'), - ), - ] diff --git a/education_directory/chkcsvfmt.fmt b/education_directory/chkcsvfmt.fmt index bc929ba0..8ef2e4d8 100644 --- a/education_directory/chkcsvfmt.fmt +++ b/education_directory/chkcsvfmt.fmt @@ -30,3 +30,51 @@ type=String data_required=False type=String +[Institution Name] +data_required=False +type=String + +[Institution Country] +data_required=False +type=String + +[Institution Region] +data_required=False +type=String + +[Institution State] +data_required=False +type=String + +[Institution City] +data_required=False +type=String + +[Thematic Area Level0] +data_required=False +type=String + +[Thematic Area Level1] +data_required=False +type=String + +[Thematic Area Level2] +data_required=False +type=String + +[Keywords] +data_required=False +type=String + +[Classification] +data_required=False +type=String + +[Pratice] +data_required=False +type=String + +[Action] +data_required=False +type=String + diff --git a/education_directory/choices.py b/education_directory/choices.py new file mode 100644 index 00000000..1be1c976 --- /dev/null +++ b/education_directory/choices.py @@ -0,0 +1,10 @@ +from django.utils.translation import gettext as _ + +classification = ( + ('', ''), + ('curso livre', _('curso livre')), + ('disciplina de graduação', _('disciplina de graduação')), + ('disciplina de lato sensu', _('disciplina de lato sensu')), + ('disciplina de stricto sensu', _('disciplina de stricto sensu')), + ('outros', _('outros')), +) diff --git a/education_directory/example_education.csv b/education_directory/example_education.csv index 07a17353..1b02068c 100644 --- a/education_directory/example_education.csv +++ b/education_directory/example_education.csv @@ -1,2 +1,2 @@ -Title,Link,Description,Institution,Start Date,End Date,Start Time,End Time -Workshop Parecer Aberto, http://exemaple.com.br, Workshop Parecer Aberto no SciELO evento financiado pela..., SciELO,27/07/2022,28/08/2022,07:30,14:30 \ No newline at end of file +Title,Link,Description,Institution,Start Date,End Date,Start Time,End Time,Institution Name,Institution Country,Institution Region,Institution State,Institution City,Thematic Area Level0,Thematic Area Level1,Thematic Area Level2,Keywords,Classification,Pratice,Action +Workshop Parecer Aberto,http://exemaple.com.br,Workshop Parecer Aberto no SciELO evento financiado pela...,SciELO,27/07/2022,28/08/2022,07:30,14:30,UERJ,Brasil,Sudeste,São Paulo,São Paulo,Ciências da Vida,Ciências Biológicas,Ciência de Alimentos,Ciências|Alimentos,portal,preprints,educação \ No newline at end of file diff --git a/education_directory/migrations/0002_auto_20220809_1204.py b/education_directory/migrations/0002_auto_20220809_1204.py new file mode 100644 index 00000000..2b5d5826 --- /dev/null +++ b/education_directory/migrations/0002_auto_20220809_1204.py @@ -0,0 +1,110 @@ +# Generated by Django 3.2.12 on 2022-08-09 12:04 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('wagtaildocs', '0012_uploadeddocument'), + ('education_directory', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='educationdirectory', + options={'verbose_name_plural': 'Diretório de Educação'}, + ), + migrations.AlterModelOptions( + name='educationdirectoryfile', + options={'verbose_name_plural': 'Diretório de Educação Upload'}, + ), + migrations.AlterField( + model_name='educationdirectory', + name='created', + field=models.DateTimeField(auto_now_add=True, verbose_name='Data de criação'), + ), + migrations.AlterField( + model_name='educationdirectory', + name='creator', + field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='educationdirectory_creator', to=settings.AUTH_USER_MODEL, verbose_name='Criador'), + ), + migrations.AlterField( + model_name='educationdirectory', + name='description', + field=models.TextField(blank=True, max_length=255, null=True, verbose_name='Descrição'), + ), + migrations.AlterField( + model_name='educationdirectory', + name='end_date', + field=models.DateField(blank=True, max_length=255, null=True, verbose_name='Data de fim'), + ), + migrations.AlterField( + model_name='educationdirectory', + name='end_time', + field=models.TimeField(blank=True, max_length=255, null=True, verbose_name='Hora final'), + ), + migrations.AlterField( + model_name='educationdirectory', + name='institution', + field=models.TextField(max_length=255, verbose_name='Instituição'), + ), + migrations.AlterField( + model_name='educationdirectory', + name='start_date', + field=models.DateField(blank=True, max_length=255, null=True, verbose_name='Data de início'), + ), + migrations.AlterField( + model_name='educationdirectory', + name='start_time', + field=models.TimeField(blank=True, max_length=255, null=True, verbose_name='Hora inicial'), + ), + migrations.AlterField( + model_name='educationdirectory', + name='updated', + field=models.DateTimeField(auto_now=True, verbose_name='Data da última atualização'), + ), + migrations.AlterField( + model_name='educationdirectory', + name='updated_by', + field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='educationdirectory_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Atualizador'), + ), + migrations.AlterField( + model_name='educationdirectoryfile', + name='attachment', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtaildocs.document', verbose_name='Anexo'), + ), + migrations.AlterField( + model_name='educationdirectoryfile', + name='created', + field=models.DateTimeField(auto_now_add=True, verbose_name='Data de criação'), + ), + migrations.AlterField( + model_name='educationdirectoryfile', + name='creator', + field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='educationdirectoryfile_creator', to=settings.AUTH_USER_MODEL, verbose_name='Criador'), + ), + migrations.AlterField( + model_name='educationdirectoryfile', + name='is_valid', + field=models.BooleanField(blank=True, default=False, null=True, verbose_name='É válido'), + ), + migrations.AlterField( + model_name='educationdirectoryfile', + name='line_count', + field=models.IntegerField(blank=True, default=0, null=True, verbose_name='Número de linhas'), + ), + migrations.AlterField( + model_name='educationdirectoryfile', + name='updated', + field=models.DateTimeField(auto_now=True, verbose_name='Data da última atualização'), + ), + migrations.AlterField( + model_name='educationdirectoryfile', + name='updated_by', + field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='educationdirectoryfile_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Atualizador'), + ), + ] diff --git a/education_directory/migrations/0003_educationdirectory_locations.py b/education_directory/migrations/0003_educationdirectory_locations.py new file mode 100644 index 00000000..6f4cf9b5 --- /dev/null +++ b/education_directory/migrations/0003_educationdirectory_locations.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2022-08-15 18:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('location', '0010_alter_location_options'), + ('education_directory', '0002_auto_20220809_1204'), + ] + + operations = [ + migrations.AddField( + model_name='educationdirectory', + name='locations', + field=models.ManyToManyField(blank=True, null=True, to='location.Location'), + ), + ] diff --git a/education_directory/migrations/0004_auto_20220815_1827.py b/education_directory/migrations/0004_auto_20220815_1827.py new file mode 100644 index 00000000..39516aba --- /dev/null +++ b/education_directory/migrations/0004_auto_20220815_1827.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.12 on 2022-08-15 18:27 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('institution', '0002_institution_institution_type'), + ('location', '0010_alter_location_options'), + ('education_directory', '0003_educationdirectory_locations'), + ] + + operations = [ + migrations.AddField( + model_name='educationdirectory', + name='institutions', + field=models.ManyToManyField(blank=True, to='institution.Institution'), + ), + migrations.AlterField( + model_name='educationdirectory', + name='locations', + field=models.ManyToManyField(blank=True, to='location.Location'), + ), + ] diff --git a/education_directory/migrations/0005_educationdirectory_is_online.py b/education_directory/migrations/0005_educationdirectory_is_online.py new file mode 100644 index 00000000..0e14bc66 --- /dev/null +++ b/education_directory/migrations/0005_educationdirectory_is_online.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2022-08-15 18:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('education_directory', '0004_auto_20220815_1827'), + ] + + operations = [ + migrations.AddField( + model_name='educationdirectory', + name='is_online', + field=models.BooleanField(default=False), + ), + ] diff --git a/education_directory/migrations/0006_remove_educationdirectory_institution.py b/education_directory/migrations/0006_remove_educationdirectory_institution.py new file mode 100644 index 00000000..510dbfb6 --- /dev/null +++ b/education_directory/migrations/0006_remove_educationdirectory_institution.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.12 on 2022-08-15 18:54 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('education_directory', '0005_educationdirectory_is_online'), + ] + + operations = [ + migrations.RemoveField( + model_name='educationdirectory', + name='institution', + ), + ] diff --git a/education_directory/migrations/0007_educationdirectory_thematic_areas.py b/education_directory/migrations/0007_educationdirectory_thematic_areas.py new file mode 100644 index 00000000..47564d15 --- /dev/null +++ b/education_directory/migrations/0007_educationdirectory_thematic_areas.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2022-08-17 13:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('usefulmodels', '0008_alter_thematicarea_options'), + ('education_directory', '0006_remove_educationdirectory_institution'), + ] + + operations = [ + migrations.AddField( + model_name='educationdirectory', + name='thematic_areas', + field=models.ManyToManyField(blank=True, to='usefulmodels.ThematicArea'), + ), + ] diff --git a/education_directory/migrations/0008_educationdirectory_keywords.py b/education_directory/migrations/0008_educationdirectory_keywords.py new file mode 100644 index 00000000..07042ffe --- /dev/null +++ b/education_directory/migrations/0008_educationdirectory_keywords.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.12 on 2022-08-17 15:42 + +from django.db import migrations +import taggit.managers + + +class Migration(migrations.Migration): + + dependencies = [ + ('taggit', '0004_alter_taggeditem_content_type_alter_taggeditem_tag'), + ('education_directory', '0007_educationdirectory_thematic_areas'), + ] + + operations = [ + migrations.AddField( + model_name='educationdirectory', + name='keywords', + field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'), + ), + ] diff --git a/education_directory/migrations/0009_auto_20220817_1810.py b/education_directory/migrations/0009_auto_20220817_1810.py new file mode 100644 index 00000000..f700fcbc --- /dev/null +++ b/education_directory/migrations/0009_auto_20220817_1810.py @@ -0,0 +1,30 @@ +# Generated by Django 3.2.12 on 2022-08-17 18:10 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('usefulmodels', '0011_action_pratice'), + ('education_directory', '0008_educationdirectory_keywords'), + ] + + operations = [ + migrations.AddField( + model_name='educationdirectory', + name='action', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='usefulmodels.action'), + ), + migrations.AddField( + model_name='educationdirectory', + name='classification', + field=models.CharField(blank=True, choices=[('', ''), ('curso livre', 'curso livre'), ('disciplina de graduação', 'disciplina de graduação'), ('disciplina de lato sensu', 'disciplina de lato sensu'), ('disciplina de stricto sensu', 'disciplina de stricto sensu'), ('outros', 'outros')], max_length=255, null=True, verbose_name='Classification'), + ), + migrations.AddField( + model_name='educationdirectory', + name='pratice', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='usefulmodels.pratice'), + ), + ] diff --git a/education_directory/migrations/0010_alter_educationdirectory_keywords.py b/education_directory/migrations/0010_alter_educationdirectory_keywords.py new file mode 100644 index 00000000..f0dc0289 --- /dev/null +++ b/education_directory/migrations/0010_alter_educationdirectory_keywords.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.12 on 2022-08-21 20:41 + +from django.db import migrations +import taggit.managers + + +class Migration(migrations.Migration): + + dependencies = [ + ('taggit', '0004_alter_taggeditem_content_type_alter_taggeditem_tag'), + ('education_directory', '0009_auto_20220817_1810'), + ] + + operations = [ + migrations.AlterField( + model_name='educationdirectory', + name='keywords', + field=taggit.managers.TaggableManager(blank=True, help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Keywords'), + ), + ] diff --git a/education_directory/models.py b/education_directory/models.py index 3f48493a..c6a68711 100644 --- a/education_directory/models.py +++ b/education_directory/models.py @@ -1,13 +1,19 @@ import os + from django.db import models from django.utils.translation import gettext as _ - -from wagtail.admin.edit_handlers import FieldPanel +from taggit.managers import TaggableManager +from wagtail.admin.edit_handlers import FieldPanel, HelpPanel from wagtail.documents.edit_handlers import DocumentChooserPanel from core.models import CommonControlField -from .forms import EducationDirectoryForm, EducationDirectoryFileForm +from institution.models import Institution +from location.models import Location +from usefulmodels.models import Pratice, ThematicArea, Action +from .forms import EducationDirectoryFileForm, EducationDirectoryForm + +from . import choices class EducationDirectory(CommonControlField): class Meta: @@ -17,8 +23,6 @@ class Meta: link = models.URLField(_("Link"), null=False, blank=False) description = models.TextField(_("Description"), max_length=255, null=True, blank=True) - institution = models.TextField(_("Institution"), max_length=255, - null=False, blank=False) start_date = models.DateField(_("Start Date"), max_length=255, null=True, blank=True) end_date = models.DateField(_("End Date"), max_length=255, @@ -28,15 +32,38 @@ class Meta: end_time = models.TimeField(_("End Time"), max_length=255, null=True, blank=True) + locations = models.ManyToManyField(Location, verbose_name=_("Location"), blank=True) + institutions = models.ManyToManyField(Institution, verbose_name=_("Institution"), blank=True) + thematic_areas = models.ManyToManyField(ThematicArea, verbose_name=_("Thematic Area"), blank=True) + + pratice = models.ForeignKey(Pratice, verbose_name=_("Pratice"), + null=True, blank=True, on_delete=models.SET_NULL) + action = models.ForeignKey(Action, verbose_name=_("Action"), null=True, blank=True, on_delete=models.SET_NULL) + + classification = models.CharField(_("Classification"), choices=choices.classification, + max_length=255, null=True, blank=True) + + keywords = TaggableManager(_("Keywords"), blank=True) + + is_online = models.BooleanField(verbose_name=_("Is Online"), default=False) + panels = [ + HelpPanel('Cursos livres, disciplinas de graduação e pós-graduação ministrados por instituições brasileiras – presenciais ou EAD- para promover a adoção dos princípios e práticas de ciência aberta por todos os envolvidos no processo de pesquisa.'), FieldPanel('title'), FieldPanel('link'), FieldPanel('description'), - FieldPanel('institution'), FieldPanel('start_date'), FieldPanel('end_date'), FieldPanel('start_time'), FieldPanel('end_time'), + FieldPanel('locations'), + FieldPanel('institutions'), + FieldPanel('thematic_areas'), + FieldPanel('classification'), + FieldPanel('pratice'), + FieldPanel('action'), + FieldPanel('keywords'), + FieldPanel('is_online'), ] base_form_class = EducationDirectoryForm diff --git a/education_directory/views.py b/education_directory/views.py index f351285c..0b8323ec 100644 --- a/education_directory/views.py +++ b/education_directory/views.py @@ -1,15 +1,17 @@ -import os import csv +import os from datetime import datetime + +from django.http import Http404, HttpResponse from django.shortcuts import get_object_or_404, redirect -from django.http import HttpResponse, Http404 from django.utils.translation import gettext as _ - from wagtail.admin import messages from core.libs import chkcsv +from institution.models import Institution +from usefulmodels.models import Action, Pratice, ThematicArea -from .models import EducationDirectoryFile, EducationDirectory +from .models import EducationDirectory, EducationDirectoryFile def validate(request): @@ -71,7 +73,7 @@ def import_file(request): with open(file_path, 'r') as csvfile: data = csv.DictReader(csvfile) - for row in data: + for line, row in enumerate(data): ed = EducationDirectory() ed.title = row['Title'] ed.link = row['Link'] @@ -83,6 +85,55 @@ def import_file(request): ed.end_time = row['End Time'] ed.creator = request.user ed.save() + + # Institution + inst_name = row['Institution Name'] + if inst_name: + inst_country = row['Institution Country'] + inst_region = row['Institution Region'] + inst_state = row['Institution State'] + inst_city = row['Institution City'] + + institution = Institution.get_or_create(inst_name, inst_country, inst_region, + inst_state, inst_city, request.user) + ed.institutions.add(institution) + + # Thematic Area + level0 = row['Thematic Area Level0'] + if level0: + level1 = row['Thematic Area Level1'] + level2 = row['Thematic Area Level2'] + the_area = ThematicArea.get_or_create(level0, level1, level2, request.user) + + ed.thematic_areas.add(the_area) + + # Keywords + if row['Keywords']: + for key in row['Keywords'].split('|'): + ed.keywords.add(key) + + if row['Classification']: + ed.classification = row['Classification'] + + # Pratice + if row['Pratice']: + pratice_name = row['Pratice'] + if Pratice.objects.filter(name=pratice_name).exists(): + pratice = Pratice.objects.get(name=pratice_name) + ed.pratice = pratice + else: + messages.error(request, _("Unknown pratice, line: %s") % str(line + 1)) + + # Action + if row['Action']: + action_name = row['Action'] + if Action.objects.filter(name=action_name).exists(): + action = Action.objects.get(name=action_name) + ed.action = action + else: + messages.error(request, _("Unknown action, line: %s") % str(line + 1)) + + ed.save() except Exception as ex: messages.error(request, _("Import error: %s") % ex) else: diff --git a/disclosure_directory/admin.py b/event_directory/admin.py similarity index 100% rename from disclosure_directory/admin.py rename to event_directory/admin.py diff --git a/disclosure_directory/apps.py b/event_directory/apps.py similarity index 54% rename from disclosure_directory/apps.py rename to event_directory/apps.py index 4c4f7833..9941734f 100644 --- a/disclosure_directory/apps.py +++ b/event_directory/apps.py @@ -1,6 +1,6 @@ from django.apps import AppConfig -class DisclosureDirectoryConfig(AppConfig): +class EventDirectoryConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' - name = 'disclosure_directory' + name = 'event_directory' diff --git a/disclosure_directory/button_helper.py b/event_directory/button_helper.py similarity index 86% rename from disclosure_directory/button_helper.py rename to event_directory/button_helper.py index e3bd1111..15c91275 100644 --- a/disclosure_directory/button_helper.py +++ b/event_directory/button_helper.py @@ -4,7 +4,7 @@ from django.urls import reverse -class DisclosureDirectoryHelper(ButtonHelper): +class EventDirectoryHelper(ButtonHelper): # Define classes for our button, here we can set an icon for example validate_button_classnames = ["button-small", "icon",] @@ -14,7 +14,7 @@ def validate_button(self, obj): # Define a label for our button text = _("Validate") return { - "url": reverse("disclosure_directory:validate") + "?file_id=%s" % str(obj.id), + "url": reverse("event_directory:validate") + "?file_id=%s" % str(obj.id), "label": text, "classname": self.finalise_classname(self.validate_button_classnames), "title": text, @@ -24,7 +24,7 @@ def import_button(self, obj): # Define a label for our button text = _("Import") return { - "url": reverse("disclosure_directory:import_file") + "?file_id=%s" % str(obj.id), + "url": reverse("event_directory:import_file") + "?file_id=%s" % str(obj.id), "label": text, "classname": self.finalise_classname(self.import_button_classnames), "title": text, diff --git a/event_directory/chkcsvfmt.fmt b/event_directory/chkcsvfmt.fmt new file mode 100644 index 00000000..354b0684 --- /dev/null +++ b/event_directory/chkcsvfmt.fmt @@ -0,0 +1,80 @@ +[Event] +data_required=True +type=String + +[Link] +data_required=False +type=String + +[Description] +data_required=False +type=String + +[Organization] +data_required=False +type=String + +[Start Date] +data_required=False +type=Date + +[End Date] +data_required=False +type=Date + +[Start Time] +data_required=False +type=String + +[End Time] +data_required=False +type=String + +[Institution Name] +data_required=False +type=String + +[Institution Country] +data_required=False +type=String + +[Institution Region] +data_required=False +type=String + +[Institution State] +data_required=False +type=String + +[Institution City] +data_required=False +type=String + +[Thematic Area Level0] +data_required=False +type=String + +[Thematic Area Level1] +data_required=False +type=String + +[Thematic Area Level2] +data_required=False +type=String + +[Keywords] +data_required=False +type=String + +[Classification] +data_required=False +type=String + +[Pratice] +data_required=False +type=String + +[Action] +data_required=False +type=String + diff --git a/event_directory/choices.py b/event_directory/choices.py new file mode 100644 index 00000000..4807f5a0 --- /dev/null +++ b/event_directory/choices.py @@ -0,0 +1,19 @@ +from django.utils.translation import gettext as _ + + +attendence_type = ( + ('', ''), + ('live', 'Live'), # All attendees are physically present in one location + ('virtual', 'Virtual'), # People attend the event entirely online + ('hybrid', 'Hybrid'), # Some people attend in person, others online +) + +classification = ( + ('', ''), + ('encontro', _('encontro')), + ('conferência', _('conferência')), + ('congresso', _('congresso')), + ('workshop', _('workshop')), + ('seminário', _('seminário')), + ('outros', _('outros')), +) diff --git a/event_directory/example_event.csv b/event_directory/example_event.csv new file mode 100644 index 00000000..bf2e3a10 --- /dev/null +++ b/event_directory/example_event.csv @@ -0,0 +1,2 @@ +Event,Link,Description,Organization,Start Date,End Date,Start Time,End Time,Institution Name,Institution Country,Institution Region,Institution State,Institution City,Thematic Area Level0,Thematic Area Level1,Thematic Area Level2,Keywords,Classification,Pratice,Action +Seminário X,http://www.sem.com.br,Seminário XPTO,SciELO,27/07/2022,28/08/2022,07:30,14:30,UERJ,Brasil,Sudeste,São Paulo,São Paulo,Ciências da Vida,Ciências Biológicas,Ciência de Alimentos,Ciências|Alimentos,portal,preprints,educação \ No newline at end of file diff --git a/event_directory/forms.py b/event_directory/forms.py new file mode 100644 index 00000000..8e40e5c0 --- /dev/null +++ b/event_directory/forms.py @@ -0,0 +1,31 @@ +from wagtail.admin.forms import WagtailAdminModelForm + + +class EventDirectoryForm(WagtailAdminModelForm): + + def save_all(self, user): + event_directory = super().save(commit=False) + + if self.instance.pk is not None: + event_directory.updated_by = user + else: + event_directory.creator = user + + self.save() + + return event_directory + + +class EventDirectoryFileForm(WagtailAdminModelForm): + + def save_all(self, user): + event_directory_file = super().save(commit=False) + + if self.instance.pk is not None: + event_directory_file.updated_by = user + else: + event_directory_file.creator = user + + self.save() + + return event_directory_file diff --git a/event_directory/migrations/0001_initial.py b/event_directory/migrations/0001_initial.py new file mode 100644 index 00000000..e0741736 --- /dev/null +++ b/event_directory/migrations/0001_initial.py @@ -0,0 +1,60 @@ +# Generated by Django 3.2.12 on 2022-08-16 12:08 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('location', '0010_alter_location_options'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('wagtaildocs', '0012_uploadeddocument'), + ('institution', '0003_institution_location'), + ] + + operations = [ + migrations.CreateModel( + name='EventDirectoryFile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True, verbose_name='Data de criação')), + ('updated', models.DateTimeField(auto_now=True, verbose_name='Data da última atualização')), + ('is_valid', models.BooleanField(blank=True, default=False, null=True, verbose_name='É válido')), + ('line_count', models.IntegerField(blank=True, default=0, null=True, verbose_name='Número de linhas')), + ('attachment', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtaildocs.document', verbose_name='Anexo')), + ('creator', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='eventdirectoryfile_creator', to=settings.AUTH_USER_MODEL, verbose_name='Criador')), + ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='eventdirectoryfile_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Atualizador')), + ], + options={ + 'verbose_name_plural': 'EventDirectory Directory Upload', + }, + ), + migrations.CreateModel( + name='EventDirectory', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True, verbose_name='Data de criação')), + ('updated', models.DateTimeField(auto_now=True, verbose_name='Data da última atualização')), + ('event', models.CharField(max_length=255, verbose_name='Evento')), + ('link', models.URLField(verbose_name='Link')), + ('description', models.TextField(blank=True, max_length=255, null=True, verbose_name='Descrição')), + ('organization', models.TextField(max_length=255, verbose_name='Organização')), + ('start_date', models.DateField(blank=True, max_length=255, null=True, verbose_name='Data de início')), + ('end_date', models.DateField(blank=True, max_length=255, null=True, verbose_name='Data de fim')), + ('start_time', models.TimeField(blank=True, max_length=255, null=True, verbose_name='Hora inicial')), + ('end_time', models.TimeField(blank=True, max_length=255, null=True, verbose_name='Hora final')), + ('is_online', models.BooleanField(default=False)), + ('creator', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='eventdirectory_creator', to=settings.AUTH_USER_MODEL, verbose_name='Criador')), + ('institutions', models.ManyToManyField(blank=True, to='institution.Institution')), + ('locations', models.ManyToManyField(blank=True, to='location.Location')), + ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='eventdirectory_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Atualizador')), + ], + options={ + 'verbose_name_plural': 'EventDirectory Directory', + }, + ), + ] diff --git a/event_directory/migrations/0002_auto_20220816_1230.py b/event_directory/migrations/0002_auto_20220816_1230.py new file mode 100644 index 00000000..57a3be43 --- /dev/null +++ b/event_directory/migrations/0002_auto_20220816_1230.py @@ -0,0 +1,22 @@ +# Generated by Django 3.2.12 on 2022-08-16 12:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('event_directory', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='eventdirectory', + name='is_online', + ), + migrations.AddField( + model_name='eventdirectory', + name='attendence', + field=models.CharField(blank=True, choices=[('', ''), ('live', 'Live'), ('virtual', 'Virtual'), ('hybrid', 'Hybrid')], max_length=255, null=True, verbose_name='Região'), + ), + ] diff --git a/event_directory/migrations/0003_alter_eventdirectory_attendence.py b/event_directory/migrations/0003_alter_eventdirectory_attendence.py new file mode 100644 index 00000000..e0e04d88 --- /dev/null +++ b/event_directory/migrations/0003_alter_eventdirectory_attendence.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2022-08-17 13:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('event_directory', '0002_auto_20220816_1230'), + ] + + operations = [ + migrations.AlterField( + model_name='eventdirectory', + name='attendence', + field=models.CharField(blank=True, choices=[('', ''), ('live', 'Live'), ('virtual', 'Virtual'), ('hybrid', 'Hybrid')], max_length=255, null=True, verbose_name='Attendence'), + ), + ] diff --git a/event_directory/migrations/0004_eventdirectory_thematic_areas.py b/event_directory/migrations/0004_eventdirectory_thematic_areas.py new file mode 100644 index 00000000..7e476314 --- /dev/null +++ b/event_directory/migrations/0004_eventdirectory_thematic_areas.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2022-08-17 15:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('usefulmodels', '0008_alter_thematicarea_options'), + ('event_directory', '0003_alter_eventdirectory_attendence'), + ] + + operations = [ + migrations.AddField( + model_name='eventdirectory', + name='thematic_areas', + field=models.ManyToManyField(blank=True, to='usefulmodels.ThematicArea'), + ), + ] diff --git a/event_directory/migrations/0005_eventdirectory_keywords.py b/event_directory/migrations/0005_eventdirectory_keywords.py new file mode 100644 index 00000000..f024329b --- /dev/null +++ b/event_directory/migrations/0005_eventdirectory_keywords.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.12 on 2022-08-17 15:42 + +from django.db import migrations +import taggit.managers + + +class Migration(migrations.Migration): + + dependencies = [ + ('taggit', '0004_alter_taggeditem_content_type_alter_taggeditem_tag'), + ('event_directory', '0004_eventdirectory_thematic_areas'), + ] + + operations = [ + migrations.AddField( + model_name='eventdirectory', + name='keywords', + field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'), + ), + ] diff --git a/event_directory/migrations/0006_auto_20220817_1810.py b/event_directory/migrations/0006_auto_20220817_1810.py new file mode 100644 index 00000000..53c30772 --- /dev/null +++ b/event_directory/migrations/0006_auto_20220817_1810.py @@ -0,0 +1,30 @@ +# Generated by Django 3.2.12 on 2022-08-17 18:10 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('usefulmodels', '0011_action_pratice'), + ('event_directory', '0005_eventdirectory_keywords'), + ] + + operations = [ + migrations.AddField( + model_name='eventdirectory', + name='action', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='usefulmodels.action'), + ), + migrations.AddField( + model_name='eventdirectory', + name='classification', + field=models.CharField(blank=True, choices=[('', ''), ('encontro', 'encontro'), ('conferência', 'conferência'), ('congresso', 'congresso'), ('workshop', 'workshop'), ('seminário', 'seminário'), ('outros', 'outros')], max_length=255, null=True, verbose_name='Classification'), + ), + migrations.AddField( + model_name='eventdirectory', + name='pratice', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='usefulmodels.pratice'), + ), + ] diff --git a/event_directory/migrations/0007_alter_eventdirectory_keywords.py b/event_directory/migrations/0007_alter_eventdirectory_keywords.py new file mode 100644 index 00000000..4d9177d5 --- /dev/null +++ b/event_directory/migrations/0007_alter_eventdirectory_keywords.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.12 on 2022-08-21 20:41 + +from django.db import migrations +import taggit.managers + + +class Migration(migrations.Migration): + + dependencies = [ + ('taggit', '0004_alter_taggeditem_content_type_alter_taggeditem_tag'), + ('event_directory', '0006_auto_20220817_1810'), + ] + + operations = [ + migrations.AlterField( + model_name='eventdirectory', + name='keywords', + field=taggit.managers.TaggableManager(blank=True, help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Keywords'), + ), + ] diff --git a/disclosure_directory/migrations/__init__.py b/event_directory/migrations/__init__.py similarity index 100% rename from disclosure_directory/migrations/__init__.py rename to event_directory/migrations/__init__.py diff --git a/disclosure_directory/models.py b/event_directory/models.py similarity index 50% rename from disclosure_directory/models.py rename to event_directory/models.py index 3ebd9bd9..31f30bfb 100644 --- a/disclosure_directory/models.py +++ b/event_directory/models.py @@ -1,17 +1,23 @@ import os + from django.db import models from django.utils.translation import gettext as _ - -from wagtail.admin.edit_handlers import FieldPanel +from taggit.managers import TaggableManager +from wagtail.admin.edit_handlers import FieldPanel, HelpPanel from wagtail.documents.edit_handlers import DocumentChooserPanel from core.models import CommonControlField -from .forms import DisclosureDirectoryForm, DisclosureDirectoryFileForm +from institution.models import Institution +from location.models import Location +from usefulmodels.models import ThematicArea, Pratice, Action + +from . import choices +from .forms import EventDirectoryFileForm, EventDirectoryForm -class DisclosureDirectory(CommonControlField): +class EventDirectory(CommonControlField): class Meta: - verbose_name_plural = _('Disclosure Directory') + verbose_name_plural = _('EventDirectory Directory') event = models.CharField(_("Event"), max_length=255, null=False, blank=False) link = models.URLField(_("Link"), null=False, blank=False) @@ -28,7 +34,22 @@ class Meta: end_time = models.TimeField(_("End Time"), max_length=255, null=True, blank=True) + locations = models.ManyToManyField(Location, verbose_name=_("Location"), blank=True) + institutions = models.ManyToManyField(Institution, verbose_name=_("Institution"), blank=True) + thematic_areas = models.ManyToManyField(ThematicArea, verbose_name=_("Thematic Area"), blank=True) + + pratice = models.ForeignKey(Pratice, verbose_name=_("Pratice"), + null=True, blank=True, on_delete=models.SET_NULL) + action = models.ForeignKey(Action, verbose_name=_("Action"), null=True, blank=True, on_delete=models.SET_NULL) + + classification = models.CharField(_("Classification"), choices=choices.classification, + max_length=255, null=True, blank=True) + keywords = TaggableManager(_("Keywords"), blank=True) + + attendence = models.CharField(_("Attendence"), choices=choices.attendence_type, max_length=255, null=True, blank=True) + panels = [ + HelpPanel('Encontros, congressos, workshops, seminários realizados no Brasil (presenciais, virtuais ou híbridos) cujo tema principal seja a promoção da Ciência Aberta'), FieldPanel('event'), FieldPanel('link'), FieldPanel('description'), @@ -37,13 +58,21 @@ class Meta: FieldPanel('end_date'), FieldPanel('start_time'), FieldPanel('end_time'), - + FieldPanel('locations'), + FieldPanel('institutions'), + FieldPanel('thematic_areas'), + FieldPanel('keywords'), + FieldPanel('classification'), + FieldPanel('pratice'), + FieldPanel('action'), + FieldPanel('attendence'), ] - base_form_class = DisclosureDirectoryForm + base_form_class = EventDirectoryForm + -class DisclosureDirectoryFile(CommonControlField): +class EventDirectoryFile(CommonControlField): class Meta: - verbose_name_plural = _('Disclosure Directory Upload') + verbose_name_plural = _('EventDirectory Directory Upload') attachment = models.ForeignKey( 'wagtaildocs.Document', @@ -63,4 +92,4 @@ def filename(self): panels = [ DocumentChooserPanel('attachment') ] - base_form_class = DisclosureDirectoryFileForm + base_form_class = EventDirectoryFileForm diff --git a/disclosure_directory/templates/modeladmin/disclosure_directory/disclosuredirectoryfile/__init__.py b/event_directory/templates/modeladmin/event_directory/eventdirectoryfile/__init__.py similarity index 100% rename from disclosure_directory/templates/modeladmin/disclosure_directory/disclosuredirectoryfile/__init__.py rename to event_directory/templates/modeladmin/event_directory/eventdirectoryfile/__init__.py diff --git a/disclosure_directory/templates/modeladmin/disclosure_directory/disclosuredirectoryfile/index.html b/event_directory/templates/modeladmin/event_directory/eventdirectoryfile/index.html similarity index 56% rename from disclosure_directory/templates/modeladmin/disclosure_directory/disclosuredirectoryfile/index.html rename to event_directory/templates/modeladmin/event_directory/eventdirectoryfile/index.html index af018788..f8db4eba 100644 --- a/disclosure_directory/templates/modeladmin/disclosure_directory/disclosuredirectoryfile/index.html +++ b/event_directory/templates/modeladmin/event_directory/eventdirectoryfile/index.html @@ -3,5 +3,5 @@ {% block header_extra %} {{ block.super }} - {% trans 'Download CSV Example' %} + {% trans 'Download CSV Example' %} {% endblock %} \ No newline at end of file diff --git a/disclosure_directory/tests.py b/event_directory/tests.py similarity index 100% rename from disclosure_directory/tests.py rename to event_directory/tests.py diff --git a/disclosure_directory/urls.py b/event_directory/urls.py similarity index 89% rename from disclosure_directory/urls.py rename to event_directory/urls.py index 70e77b19..b12efd50 100644 --- a/disclosure_directory/urls.py +++ b/event_directory/urls.py @@ -2,7 +2,7 @@ from .views import import_file, validate, download_sample -app_name = "disclosure_directory" +app_name = "event_directory" urlpatterns = [ path("validate", view=validate, name="validate"), path("import", view=import_file, name="import_file"), diff --git a/disclosure_directory/views.py b/event_directory/views.py similarity index 54% rename from disclosure_directory/views.py rename to event_directory/views.py index bcf15e8f..d74d0840 100644 --- a/disclosure_directory/views.py +++ b/event_directory/views.py @@ -1,15 +1,17 @@ -import os import csv +import os from datetime import datetime + +from django.http import Http404, HttpResponse from django.shortcuts import get_object_or_404, redirect -from django.http import HttpResponse, Http404 from django.utils.translation import gettext as _ - from wagtail.admin import messages from core.libs import chkcsv +from institution.models import Institution +from usefulmodels.models import Action, Pratice, ThematicArea -from .models import DisclosureDirectoryFile, DisclosureDirectory +from .models import EventDirectory, EventDirectoryFile def validate(request): @@ -26,7 +28,7 @@ def validate(request): file_id = request.GET.get("file_id", None) if file_id: - file_upload = get_object_or_404(DisclosureDirectoryFile, pk=file_id) + file_upload = get_object_or_404(EventDirectoryFile, pk=file_id) if request.method == 'GET': try: @@ -63,7 +65,7 @@ def import_file(request): file_id = request.GET.get("file_id", None) if file_id: - file_upload = get_object_or_404(DisclosureDirectoryFile, pk=file_id) + file_upload = get_object_or_404(EventDirectoryFile, pk=file_id) file_path = file_upload.attachment.file.path @@ -71,8 +73,8 @@ def import_file(request): with open(file_path, 'r') as csvfile: data = csv.DictReader(csvfile) - for row in data: - di = DisclosureDirectory() + for line, row in enumerate(data): + di = EventDirectory() di.event = row['Event'] di.link = row['Link'] di.description = row['Description'] @@ -83,6 +85,56 @@ def import_file(request): di.end_time = row['End Time'] di.creator = request.user di.save() + + # Institution + inst_name = row['Institution Name'] + if inst_name: + inst_country = row['Institution Country'] + inst_region = row['Institution Region'] + inst_state = row['Institution State'] + inst_city = row['Institution City'] + + institution = Institution.get_or_create(inst_name, inst_country, inst_region, + inst_state, inst_city, request.user) + di.institutions.add(institution) + + # Thematic Area + level0 = row['Thematic Area Level0'] + if level0: + level1 = row['Thematic Area Level1'] + level2 = row['Thematic Area Level2'] + the_area = ThematicArea.get_or_create(level0, level1, level2, request.user) + + di.thematic_areas.add(the_area) + + # Keywords + if row['Keywords']: + for key in row['Keywords'].split('|'): + di.keywords.add(key) + + if row['Classification']: + di.classification = row['Classification'] + + # Pratice + if row['Pratice']: + pratice_name = row['Pratice'] + if Pratice.objects.filter(name=pratice_name).exists(): + pratice = Pratice.objects.get(name=pratice_name) + di.pratice = pratice + else: + messages.error(request, _("Unknown pratice, line: %s") % str(line + 1)) + + # Action + if row['Action']: + action_name = row['Action'] + if Action.objects.filter(name=action_name).exists(): + action = Action.objects.get(name=action_name) + di.action = action + else: + messages.error(request, _("Unknown action, line: %s") % str(line + 1)) + + di.save() + except Exception as ex: messages.error(request, _("Import error: %s") % ex) else: @@ -93,9 +145,9 @@ def import_file(request): def download_sample(request): """ - This view function a CSV sample for model DisclosureDirectoryFile. + This view function a CSV sample for model EventDirectoryFile. """ - file_path = os.path.dirname(os.path.abspath(__file__)) + "/example_disclosure.csv" + file_path = os.path.dirname(os.path.abspath(__file__)) + "/example_event.csv" if os.path.exists(file_path): with open(file_path, 'rb') as fh: response = HttpResponse(fh.read(), content_type="text/csv") diff --git a/disclosure_directory/wagtail_hooks.py b/event_directory/wagtail_hooks.py similarity index 58% rename from disclosure_directory/wagtail_hooks.py rename to event_directory/wagtail_hooks.py index a8a3a4f4..d24096b3 100644 --- a/disclosure_directory/wagtail_hooks.py +++ b/event_directory/wagtail_hooks.py @@ -6,29 +6,29 @@ from wagtail.contrib.modeladmin.views import CreateView from wagtail.contrib.modeladmin.options import (ModelAdmin, modeladmin_register, ModelAdminGroup) -from .models import DisclosureDirectory, DisclosureDirectoryFile -from .button_helper import DisclosureDirectoryHelper +from .models import EventDirectory, EventDirectoryFile +from .button_helper import EventDirectoryHelper from .views import validate, import_file -class DisclosureDirectoryCreateView(CreateView): +class EventDirectoryCreateView(CreateView): def form_valid(self, form): self.object = form.save_all(self.request.user) return HttpResponseRedirect(self.get_success_url()) -class DisclosureDirectoryFileCreateView(CreateView): +class EventDirectoryFileCreateView(CreateView): def form_valid(self, form): self.object = form.save_all(self.request.user) return HttpResponseRedirect(self.get_success_url()) -class DisclosureDirectoryAdmin(ModelAdmin): - model = DisclosureDirectory - create_view_class = DisclosureDirectoryCreateView - menu_label = _('Disclosure Directory') +class EventDirectoryAdmin(ModelAdmin): + model = EventDirectory + create_view_class = EventDirectoryCreateView + menu_label = _('Event Directory') menu_icon = 'folder' menu_order = 100 add_to_settings_menu = False # or True to add your model to the Settings sub-menu @@ -37,14 +37,14 @@ class DisclosureDirectoryAdmin(ModelAdmin): 'updated', 'created') search_fields = ('event', 'description') list_export = ('event', 'link', 'description') - export_filename = 'disclosure_directory' + export_filename = 'Event_directory' -class DisclosureDirectoryFileAdmin(ModelAdmin): - model = DisclosureDirectoryFile - create_view_class=DisclosureDirectoryFileCreateView - button_helper_class = DisclosureDirectoryHelper - menu_label = _('Disclosure Directory Upload') +class EventDirectoryFileAdmin(ModelAdmin): + model = EventDirectoryFile + create_view_class=EventDirectoryFileCreateView + button_helper_class = EventDirectoryHelper + menu_label = _('Event Directory Upload') menu_icon = 'folder' menu_order = 200 add_to_settings_menu = False @@ -55,19 +55,19 @@ class DisclosureDirectoryFileAdmin(ModelAdmin): search_fields = ('attachment', ) -class DisclosureDirectoryAdminGroup(ModelAdminGroup): - menu_label = _('Disclosure Directory') +class EventDirectoryAdminGroup(ModelAdminGroup): + menu_label = _('Event Directory') menu_icon = 'folder-open-inverse' menu_order = 200 - items = (DisclosureDirectoryAdmin, DisclosureDirectoryFileAdmin,) + items = (EventDirectoryAdmin, EventDirectoryFileAdmin,) -modeladmin_register(DisclosureDirectoryAdminGroup) +modeladmin_register(EventDirectoryAdminGroup) @hooks.register('register_admin_urls') -def register_disclosure_url(): +def register_Event_url(): return [ - path('disclosure_directory/DisclosureDirectoryfile/', - include('disclosure_directory.urls', namespace='disclosure_directory')), + path('event_directory/eventDirectoryfile/', + include('event_directory.urls', namespace='event_directory')), ] diff --git a/infrastructure_directory/chkcsvfmt.fmt b/infrastructure_directory/chkcsvfmt.fmt index b8f5a46a..6f05b10f 100644 --- a/infrastructure_directory/chkcsvfmt.fmt +++ b/infrastructure_directory/chkcsvfmt.fmt @@ -8,4 +8,52 @@ type=String [Description] data_required=False -type=String \ No newline at end of file +type=String + +[Institution Name] +data_required=False +type=String + +[Institution Country] +data_required=False +type=String + +[Institution Region] +data_required=False +type=String + +[Institution State] +data_required=False +type=String + +[Institution City] +data_required=False +type=String + +[Thematic Area Level0] +data_required=False +type=String + +[Thematic Area Level1] +data_required=False +type=String + +[Thematic Area Level2] +data_required=False +type=String + +[Keywords] +data_required=False +type=String + +[Classification] +data_required=False +type=String + +[Pratice] +data_required=False +type=String + +[Action] +data_required=False +type=String diff --git a/infrastructure_directory/choices.py b/infrastructure_directory/choices.py new file mode 100644 index 00000000..4d69ea79 --- /dev/null +++ b/infrastructure_directory/choices.py @@ -0,0 +1,11 @@ +from django.utils.translation import gettext as _ + +classification = ( + ('', ''), + ('portal', _('Portal')), + ('plataforma', _('Plataforma')), + ('servidor', _('Servidor')), + ('repositório', _('Repositório')), + ('serviço', _('Serviço')), + ('outras', _('Outras')), +) diff --git a/infrastructure_directory/example_infra.csv b/infrastructure_directory/example_infra.csv index 3d7363d0..7ffd80ed 100644 --- a/infrastructure_directory/example_infra.csv +++ b/infrastructure_directory/example_infra.csv @@ -1,2 +1,2 @@ -Title,Link,Description -FAPESP,http://www.fapesp.com.br,Description \ No newline at end of file +Title,Link,Description,Institution Name,Institution Country,Institution Region,Institution State,Institution City,Thematic Area Level0,Thematic Area Level1,Thematic Area Level2,Keywords,Classification,Pratice,Action +FAPESP,http://www.fapesp.com.br,Description,UERJ,Brasil,Sudeste,São Paulo,São Paulo,Ciências da Vida,Ciências Biológicas,Ciência de Alimentos,Ciências|Alimentos,portal,preprints,educação \ No newline at end of file diff --git a/infrastructure_directory/migrations/0004_auto_20220809_1204.py b/infrastructure_directory/migrations/0004_auto_20220809_1204.py new file mode 100644 index 00000000..59fb60e8 --- /dev/null +++ b/infrastructure_directory/migrations/0004_auto_20220809_1204.py @@ -0,0 +1,85 @@ +# Generated by Django 3.2.12 on 2022-08-09 12:04 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('wagtaildocs', '0012_uploadeddocument'), + ('infrastructure_directory', '0003_auto_20220705_1355'), + ] + + operations = [ + migrations.AlterModelOptions( + name='infrastructuredirectory', + options={'verbose_name_plural': 'Diretório de Infraestrutura'}, + ), + migrations.AlterModelOptions( + name='infrastructuredirectoryfile', + options={'verbose_name_plural': 'Diretório de Infraestrutura Upload'}, + ), + migrations.AlterField( + model_name='infrastructuredirectory', + name='created', + field=models.DateTimeField(auto_now_add=True, verbose_name='Data de criação'), + ), + migrations.AlterField( + model_name='infrastructuredirectory', + name='creator', + field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='infrastructuredirectory_creator', to=settings.AUTH_USER_MODEL, verbose_name='Criador'), + ), + migrations.AlterField( + model_name='infrastructuredirectory', + name='description', + field=models.TextField(blank=True, max_length=255, null=True, verbose_name='Descrição'), + ), + migrations.AlterField( + model_name='infrastructuredirectory', + name='updated', + field=models.DateTimeField(auto_now=True, verbose_name='Data da última atualização'), + ), + migrations.AlterField( + model_name='infrastructuredirectory', + name='updated_by', + field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='infrastructuredirectory_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Atualizador'), + ), + migrations.AlterField( + model_name='infrastructuredirectoryfile', + name='attachment', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtaildocs.document', verbose_name='Anexo'), + ), + migrations.AlterField( + model_name='infrastructuredirectoryfile', + name='created', + field=models.DateTimeField(auto_now_add=True, verbose_name='Data de criação'), + ), + migrations.AlterField( + model_name='infrastructuredirectoryfile', + name='creator', + field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='infrastructuredirectoryfile_creator', to=settings.AUTH_USER_MODEL, verbose_name='Criador'), + ), + migrations.AlterField( + model_name='infrastructuredirectoryfile', + name='is_valid', + field=models.BooleanField(blank=True, default=False, null=True, verbose_name='É válido'), + ), + migrations.AlterField( + model_name='infrastructuredirectoryfile', + name='line_count', + field=models.IntegerField(blank=True, default=0, null=True, verbose_name='Número de linhas'), + ), + migrations.AlterField( + model_name='infrastructuredirectoryfile', + name='updated', + field=models.DateTimeField(auto_now=True, verbose_name='Data da última atualização'), + ), + migrations.AlterField( + model_name='infrastructuredirectoryfile', + name='updated_by', + field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='infrastructuredirectoryfile_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Atualizador'), + ), + ] diff --git a/infrastructure_directory/migrations/0005_infrastructuredirectory_institution.py b/infrastructure_directory/migrations/0005_infrastructuredirectory_institution.py new file mode 100644 index 00000000..d8c99a4b --- /dev/null +++ b/infrastructure_directory/migrations/0005_infrastructuredirectory_institution.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2022-08-15 18:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('institution', '0003_institution_location'), + ('infrastructure_directory', '0004_auto_20220809_1204'), + ] + + operations = [ + migrations.AddField( + model_name='infrastructuredirectory', + name='institution', + field=models.ManyToManyField(blank=True, to='institution.Institution'), + ), + ] diff --git a/infrastructure_directory/migrations/0006_rename_institution_infrastructuredirectory_institutions.py b/infrastructure_directory/migrations/0006_rename_institution_infrastructuredirectory_institutions.py new file mode 100644 index 00000000..fbf2995b --- /dev/null +++ b/infrastructure_directory/migrations/0006_rename_institution_infrastructuredirectory_institutions.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2022-08-16 12:18 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('infrastructure_directory', '0005_infrastructuredirectory_institution'), + ] + + operations = [ + migrations.RenameField( + model_name='infrastructuredirectory', + old_name='institution', + new_name='institutions', + ), + ] diff --git a/infrastructure_directory/migrations/0007_infrastructuredirectory_thematic_areas.py b/infrastructure_directory/migrations/0007_infrastructuredirectory_thematic_areas.py new file mode 100644 index 00000000..d89e0ce4 --- /dev/null +++ b/infrastructure_directory/migrations/0007_infrastructuredirectory_thematic_areas.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2022-08-17 15:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('usefulmodels', '0008_alter_thematicarea_options'), + ('infrastructure_directory', '0006_rename_institution_infrastructuredirectory_institutions'), + ] + + operations = [ + migrations.AddField( + model_name='infrastructuredirectory', + name='thematic_areas', + field=models.ManyToManyField(blank=True, to='usefulmodels.ThematicArea'), + ), + ] diff --git a/infrastructure_directory/migrations/0008_infrastructuredirectory_keywords.py b/infrastructure_directory/migrations/0008_infrastructuredirectory_keywords.py new file mode 100644 index 00000000..8f31ad29 --- /dev/null +++ b/infrastructure_directory/migrations/0008_infrastructuredirectory_keywords.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.12 on 2022-08-17 15:42 + +from django.db import migrations +import taggit.managers + + +class Migration(migrations.Migration): + + dependencies = [ + ('taggit', '0004_alter_taggeditem_content_type_alter_taggeditem_tag'), + ('infrastructure_directory', '0007_infrastructuredirectory_thematic_areas'), + ] + + operations = [ + migrations.AddField( + model_name='infrastructuredirectory', + name='keywords', + field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'), + ), + ] diff --git a/infrastructure_directory/migrations/0009_auto_20220817_1810.py b/infrastructure_directory/migrations/0009_auto_20220817_1810.py new file mode 100644 index 00000000..b2f08e01 --- /dev/null +++ b/infrastructure_directory/migrations/0009_auto_20220817_1810.py @@ -0,0 +1,30 @@ +# Generated by Django 3.2.12 on 2022-08-17 18:10 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('usefulmodels', '0011_action_pratice'), + ('infrastructure_directory', '0008_infrastructuredirectory_keywords'), + ] + + operations = [ + migrations.AddField( + model_name='infrastructuredirectory', + name='action', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='usefulmodels.action'), + ), + migrations.AddField( + model_name='infrastructuredirectory', + name='classification', + field=models.CharField(blank=True, choices=[('', ''), ('portal', 'portal'), ('plataforma', 'plataforma'), ('servidor', 'servidor'), ('repositório', 'repositório'), ('serviço', 'serviço'), ('outras', 'outras')], max_length=255, null=True, verbose_name='Classification'), + ), + migrations.AddField( + model_name='infrastructuredirectory', + name='pratice', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='usefulmodels.pratice'), + ), + ] diff --git a/infrastructure_directory/migrations/0010_auto_20220819_1331.py b/infrastructure_directory/migrations/0010_auto_20220819_1331.py new file mode 100644 index 00000000..1dc7bb18 --- /dev/null +++ b/infrastructure_directory/migrations/0010_auto_20220819_1331.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.12 on 2022-08-19 13:31 + +from django.db import migrations, models +import taggit.managers + + +class Migration(migrations.Migration): + + dependencies = [ + ('taggit', '0004_alter_taggeditem_content_type_alter_taggeditem_tag'), + ('infrastructure_directory', '0009_auto_20220817_1810'), + ] + + operations = [ + migrations.AlterField( + model_name='infrastructuredirectory', + name='classification', + field=models.CharField(blank=True, choices=[('', ''), ('portal', 'Portal'), ('plataforma', 'Plataforma'), ('servidor', 'Servidor'), ('repositório', 'Repositório'), ('serviço', 'Serviço'), ('outras', 'Outras')], max_length=255, null=True, verbose_name='Classification'), + ), + migrations.AlterField( + model_name='infrastructuredirectory', + name='keywords', + field=taggit.managers.TaggableManager(blank=True, help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'), + ), + ] diff --git a/infrastructure_directory/migrations/0011_alter_infrastructuredirectory_keywords.py b/infrastructure_directory/migrations/0011_alter_infrastructuredirectory_keywords.py new file mode 100644 index 00000000..a79a26c7 --- /dev/null +++ b/infrastructure_directory/migrations/0011_alter_infrastructuredirectory_keywords.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.12 on 2022-08-21 20:41 + +from django.db import migrations +import taggit.managers + + +class Migration(migrations.Migration): + + dependencies = [ + ('taggit', '0004_alter_taggeditem_content_type_alter_taggeditem_tag'), + ('infrastructure_directory', '0010_auto_20220819_1331'), + ] + + operations = [ + migrations.AlterField( + model_name='infrastructuredirectory', + name='keywords', + field=taggit.managers.TaggableManager(blank=True, help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Keywords'), + ), + ] diff --git a/infrastructure_directory/models.py b/infrastructure_directory/models.py index 1411a32b..8d83ce35 100644 --- a/infrastructure_directory/models.py +++ b/infrastructure_directory/models.py @@ -1,12 +1,17 @@ import os + from django.db import models from django.utils.translation import gettext as _ - -from wagtail.admin.edit_handlers import FieldPanel +from taggit.managers import TaggableManager +from wagtail.admin.edit_handlers import FieldPanel, HelpPanel from wagtail.documents.edit_handlers import DocumentChooserPanel from core.models import CommonControlField -from .forms import InfrastructureDirectoryForm, InfrastructureDirectoryFileForm +from institution.models import Institution +from usefulmodels.models import ThematicArea, Pratice, Action + +from . import choices +from .forms import InfrastructureDirectoryFileForm, InfrastructureDirectoryForm class InfrastructureDirectory(CommonControlField): @@ -18,10 +23,30 @@ class Meta: description = models.TextField(_("Description"), max_length=255, null=True, blank=True) + institutions = models.ManyToManyField(Institution, verbose_name=_("Institution"), blank=True) + thematic_areas = models.ManyToManyField(ThematicArea, verbose_name=_("Thematic Area"), blank=True) + + pratice = models.ForeignKey(Pratice, verbose_name=_("Pratice"), + null=True, blank=True, on_delete=models.SET_NULL) + action = models.ForeignKey(Action, verbose_name=_("Action"), null=True, blank=True, on_delete=models.SET_NULL) + + + classification = models.CharField(_("Classification"), choices=choices.classification, + max_length=255, null=True, blank=True) + + keywords = TaggableManager(_("Keywords"), blank=True) + panels = [ + HelpPanel('Portais, plataformas, servidores, repositórios e serviços brasileiros que operam em acesso aberto objetos de comunicação de comunicação de pesquisas, recursos de apoio e resultantes de pesquisas e em acesso aberto.'), FieldPanel('title'), FieldPanel('link'), - FieldPanel('description') + FieldPanel('description'), + FieldPanel('institutions'), + FieldPanel('thematic_areas'), + FieldPanel('keywords'), + FieldPanel('classification'), + FieldPanel('pratice'), + FieldPanel('action'), ] base_form_class = InfrastructureDirectoryForm diff --git a/infrastructure_directory/views.py b/infrastructure_directory/views.py index 88212783..8184865c 100644 --- a/infrastructure_directory/views.py +++ b/infrastructure_directory/views.py @@ -1,15 +1,16 @@ -import os import csv +import os + +from django.http import Http404, HttpResponse from django.shortcuts import get_object_or_404, redirect -from django.http import HttpResponse, Http404 from django.utils.translation import gettext as _ - - from wagtail.admin import messages from core.libs import chkcsv +from institution.models import Institution +from usefulmodels.models import Action, Pratice, ThematicArea -from .models import InfrastructureDirectoryFile, InfrastructureDirectory +from .models import InfrastructureDirectory, InfrastructureDirectoryFile def validate(request): @@ -71,17 +72,68 @@ def import_file(request): with open(file_path, 'r') as csvfile: data = csv.DictReader(csvfile) - for row in data: + for line, row in enumerate(data): isd = InfrastructureDirectory() isd.title = row['Title'] isd.link = row['Link'] isd.description = row['Description'] + isd.creator = request.user isd.save() + + # Institution + inst_name = row['Institution Name'] + if inst_name: + inst_country = row['Institution Country'] + inst_region = row['Institution Region'] + inst_state = row['Institution State'] + inst_city = row['Institution City'] + + institution = Institution.get_or_create(inst_name, inst_country, inst_region, + inst_state, inst_city, request.user) + isd.institutions.add(institution) + + # Thematic Area + level0 = row['Thematic Area Level0'] + if level0: + level1 = row['Thematic Area Level1'] + level2 = row['Thematic Area Level2'] + the_area = ThematicArea.get_or_create(level0, level1, level2, request.user) + + isd.thematic_areas.add(the_area) + + # Keywords + if row['Keywords']: + for key in row['Keywords'].split('|'): + isd.keywords.add(key) + + if row['Classification']: + isd.classification = row['Classification'] + + # Pratice + if row['Pratice']: + pratice_name = row['Pratice'] + if Pratice.objects.filter(name=pratice_name).exists(): + pratice = Pratice.objects.get(name=pratice_name) + isd.pratice = pratice + else: + messages.error(request, _("Unknown pratice, line: %s") % str(line + 1)) + + # Action + if row['Action']: + action_name = row['Action'] + if Action.objects.filter(name=action_name).exists(): + action = Action.objects.get(name=action_name) + isd.action = action + else: + messages.error(request, _("Unknown action, line: %s") % str(line + 1)) + + isd.save() + except Exception as ex: messages.error(request, _("Import error: %s") % ex) else: - messages.success(request, _("File imported successfully!")) + messages.success(request, _("File imported successfully!")) return redirect(request.META.get('HTTP_REFERER')) diff --git a/institution/__init__.py b/institution/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/institution/admin.py b/institution/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/institution/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/institution/apps.py b/institution/apps.py new file mode 100644 index 00000000..3814434f --- /dev/null +++ b/institution/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class InstitutionConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'institution' diff --git a/institution/choices.py b/institution/choices.py new file mode 100644 index 00000000..c2e0f236 --- /dev/null +++ b/institution/choices.py @@ -0,0 +1,13 @@ +from django.utils.translation import gettext as _ + + +inst_type = ( + ('', ''), + ('agência de apoio à pesquisa', _('agência de apoio à pesquisa')), + ('universidade e instâncias ligadas à universidades', _('universidade e instâncias ligadas à universidades')), + ('empresa ou instituto ligadas ao governo', _('empresa ou instituto ligadas ao governo')), + ('organização privada', _('organização privada')), + ('organização sem fins de lucros', _('organização sem fins de lucros')), + ('sociedade científica, associação pós-graduação, associação profissional', _('sociedade científica, associação pós-graduação, associação profissional')), + ('outros', _('outros')), +) diff --git a/institution/forms.py b/institution/forms.py new file mode 100644 index 00000000..c14f7af9 --- /dev/null +++ b/institution/forms.py @@ -0,0 +1,16 @@ +from wagtail.admin.forms import WagtailAdminModelForm + + +class InstitutionForm(WagtailAdminModelForm): + + def save_all(self, user): + inst = super().save(commit=False) + + if self.instance.pk is not None: + inst.updated_by = user + else: + inst.creator = user + + self.save() + + return inst diff --git a/institution/migrations/0001_initial.py b/institution/migrations/0001_initial.py new file mode 100644 index 00000000..1c658a97 --- /dev/null +++ b/institution/migrations/0001_initial.py @@ -0,0 +1,31 @@ +# Generated by Django 3.2.12 on 2022-08-15 12:21 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Institution', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True, verbose_name='Data de criação')), + ('updated', models.DateTimeField(auto_now=True, verbose_name='Data da última atualização')), + ('name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Nome')), + ('creator', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='institution_creator', to=settings.AUTH_USER_MODEL, verbose_name='Criador')), + ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='institution_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Atualizador')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/institution/migrations/0002_institution_institution_type.py b/institution/migrations/0002_institution_institution_type.py new file mode 100644 index 00000000..e7635e17 --- /dev/null +++ b/institution/migrations/0002_institution_institution_type.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2022-08-15 18:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('institution', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='institution', + name='institution_type', + field=models.CharField(blank=True, choices=[('', ''), ('agência de apoio à pesquisa', 'agência de apoio à pesquisa'), ('universidade e instâncias ligadas à universidades', 'universidade e instâncias ligadas à universidades'), ('empresa ou instituto ligadas ao governo', 'empresa ou instituto ligadas ao governo'), ('organização privada', 'organização privada'), ('organização sem fins de lucros', 'organização sem fins de lucros'), ('sociedade científica, associação pós-graduação, associação profissional', 'sociedade científica, associação pós-graduação, associação profissional'), ('outros', 'outros')], max_length=255, null=True, verbose_name='Institution Type'), + ), + ] diff --git a/institution/migrations/0003_institution_location.py b/institution/migrations/0003_institution_location.py new file mode 100644 index 00000000..2615d14a --- /dev/null +++ b/institution/migrations/0003_institution_location.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.12 on 2022-08-15 18:48 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('location', '0010_alter_location_options'), + ('institution', '0002_institution_institution_type'), + ] + + operations = [ + migrations.AddField( + model_name='institution', + name='location', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='location.location'), + ), + ] diff --git a/institution/migrations/__init__.py b/institution/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/institution/models.py b/institution/models.py new file mode 100644 index 00000000..04d3da6e --- /dev/null +++ b/institution/models.py @@ -0,0 +1,53 @@ +from django.db import models +from django.utils.translation import gettext as _ +from modelcluster.models import ClusterableModel +from wagtail.admin.edit_handlers import FieldPanel, InlinePanel + +from core.models import CommonControlField +from location.models import Location + +from . import choices +from .forms import InstitutionForm + + +class Institution(CommonControlField, ClusterableModel): + name = models.CharField(_("Name"), max_length=255, null=True, blank=True) + institution_type = models.CharField(_("Institution Type"), choices=choices.inst_type, + max_length=255, null=True, blank=True) + + location = models.ForeignKey(Location, null=True, blank=True, on_delete=models.SET_NULL) + panels = [ + FieldPanel('name'), + FieldPanel('institution_type'), + FieldPanel('location'), + ] + + def __unicode__(self): + return u'%s - %s: %s' % (self.name, _('Location'), self.location) + + def __str__(self): + return u'%s - %s: %s' % (self.name, _('Location'), self.location) + + @classmethod + def get_or_create(cls, inst_name, location_country, location_region, + location_state, location_city, user): + + # Institution + # check if exists the institution + if cls.objects.filter(name=inst_name).exists(): + return cls.objects.get(name=inst_name) + else: + institution = cls() + institution.name = inst_name + institution.creator = user + + institution.location = Location.get_or_create(location_country, + location_region, + location_state, + location_city, + user) + + institution.save() + return institution + + base_form_class = InstitutionForm diff --git a/institution/tests.py b/institution/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/institution/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/institution/views.py b/institution/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/institution/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/institution/wagtail_hooks.py b/institution/wagtail_hooks.py new file mode 100644 index 00000000..6821f3b4 --- /dev/null +++ b/institution/wagtail_hooks.py @@ -0,0 +1,31 @@ +from django.http import HttpResponseRedirect +from django.utils.translation import gettext as _ + +from wagtail.contrib.modeladmin.views import CreateView +from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register + +from .models import Institution + + +class InstitutionCreateView(CreateView): + + def form_valid(self, form): + self.object = form.save_all(self.request.user) + return HttpResponseRedirect(self.get_success_url()) + + +class InstitutionAdmin(ModelAdmin): + model = Institution + create_view_class = InstitutionCreateView + menu_label = _('Institution') + menu_icon = 'folder' + menu_order = 300 + add_to_settings_menu = False # or True to add your model to the Settings sub-menu + exclude_from_explorer = False # or True to exclude pages of this type from Wagtail's explorer view + list_display = ('name', 'institution_type', 'creator', 'updated', 'created', 'updated_by') + search_fields = ('name', 'institution_type', 'creator', 'updated', 'created', 'updated_by') + list_export = ('name', 'institution_type', 'creator', 'updated', 'created', 'updated_by') + export_filename = 'institutions' + + +modeladmin_register(InstitutionAdmin) diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 68570bc6..20854294 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-08-09 12:20+0000\n" +"POT-Creation-Date: 2022-08-21 20:52+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,11 +18,11 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: config/settings/base.py:374 +#: config/settings/base.py:376 msgid "Sobre o Projeto" msgstr "About the project" -#: config/settings/base.py:376 +#: config/settings/base.py:378 msgid "Notícias" msgstr "News" @@ -386,177 +386,347 @@ msgstr "" msgid "Admin settings" msgstr "" -#: disclosure_directory/button_helper.py:15 -#: education_directory/button_helper.py:15 +#: education_directory/button_helper.py:15 event_directory/button_helper.py:15 #: infrastructure_directory/button_helper.py:15 #: policy_directory/button_helper.py:15 msgid "Validate" msgstr "" -#: disclosure_directory/button_helper.py:25 -#: education_directory/button_helper.py:25 +#: education_directory/button_helper.py:25 event_directory/button_helper.py:25 #: infrastructure_directory/button_helper.py:25 #: policy_directory/button_helper.py:25 msgid "Import" msgstr "" -#: disclosure_directory/models.py:14 disclosure_directory/wagtail_hooks.py:31 -#: disclosure_directory/wagtail_hooks.py:59 -msgid "Disclosure Directory" +#: education_directory/choices.py:5 +msgid "curso livre" msgstr "" -#: disclosure_directory/models.py:16 -msgid "Event" +#: education_directory/choices.py:6 +msgid "disciplina de graduação" msgstr "" -#: disclosure_directory/models.py:17 education_directory/models.py:17 -#: infrastructure_directory/models.py:17 policy_directory/models.py:17 -msgid "Link" +#: education_directory/choices.py:7 +msgid "disciplina de lato sensu" msgstr "" -#: disclosure_directory/models.py:18 education_directory/models.py:18 -#: infrastructure_directory/models.py:18 policy_directory/models.py:20 -msgid "Description" +#: education_directory/choices.py:8 +msgid "disciplina de stricto sensu" msgstr "" -#: disclosure_directory/models.py:20 -msgid "Organization" +#: education_directory/choices.py:9 event_directory/choices.py:18 +#: institution/choices.py:12 +msgid "outros" +msgstr "" + +#: education_directory/models.py:20 education_directory/wagtail_hooks.py:31 +#: education_directory/wagtail_hooks.py:59 +msgid "Education Directory" +msgstr "" + +#: education_directory/models.py:22 infrastructure_directory/models.py:21 +#: policy_directory/models.py:20 +msgid "Title" +msgstr "" + +#: education_directory/models.py:23 event_directory/models.py:23 +#: infrastructure_directory/models.py:22 policy_directory/models.py:21 +msgid "Link" +msgstr "" + +#: education_directory/models.py:24 event_directory/models.py:24 +#: infrastructure_directory/models.py:23 policy_directory/models.py:22 +msgid "Description" msgstr "" -#: disclosure_directory/models.py:22 education_directory/models.py:22 -#: policy_directory/models.py:22 +#: education_directory/models.py:26 event_directory/models.py:28 +#: policy_directory/models.py:24 msgid "Start Date" msgstr "" -#: disclosure_directory/models.py:24 education_directory/models.py:24 +#: education_directory/models.py:28 event_directory/models.py:30 msgid "End Date" msgstr "" -#: disclosure_directory/models.py:26 education_directory/models.py:26 -#: education_directory/views.py:107 +#: education_directory/models.py:30 education_directory/views.py:158 +#: event_directory/models.py:32 msgid "Start Time" msgstr "" -#: disclosure_directory/models.py:28 education_directory/models.py:28 -#: education_directory/views.py:109 +#: education_directory/models.py:32 education_directory/views.py:160 +#: event_directory/models.py:34 msgid "End Time" msgstr "" -#: disclosure_directory/models.py:46 disclosure_directory/wagtail_hooks.py:47 -msgid "Disclosure Directory Upload" +#: education_directory/models.py:35 event_directory/models.py:37 +#: institution/models.py:26 institution/models.py:29 location/models.py:24 +#: location/wagtail_hooks.py:21 +msgid "Location" +msgstr "" + +#: education_directory/models.py:36 event_directory/models.py:38 +#: infrastructure_directory/models.py:26 institution/wagtail_hooks.py:20 +#: policy_directory/models.py:27 +msgid "Institution" +msgstr "" + +#: education_directory/models.py:37 event_directory/models.py:39 +#: infrastructure_directory/models.py:27 policy_directory/models.py:28 +#: usefulmodels/models.py:102 usefulmodels/wagtail_hooks.py:98 +msgid "Thematic Area" +msgstr "" + +#: education_directory/models.py:39 event_directory/models.py:41 +#: infrastructure_directory/models.py:29 policy_directory/models.py:30 +#: usefulmodels/models.py:142 usefulmodels/wagtail_hooks.py:113 +msgid "Pratice" +msgstr "" + +#: education_directory/models.py:41 event_directory/models.py:43 +#: infrastructure_directory/models.py:31 policy_directory/models.py:32 +#: usefulmodels/models.py:167 usefulmodels/wagtail_hooks.py:128 +msgid "Action" msgstr "" -#: disclosure_directory/models.py:50 education_directory/models.py:49 -#: infrastructure_directory/models.py:34 policy_directory/models.py:41 +#: education_directory/models.py:43 event_directory/models.py:45 +#: infrastructure_directory/models.py:34 policy_directory/models.py:34 +msgid "Classification" +msgstr "" + +#: education_directory/models.py:46 event_directory/models.py:47 +#: infrastructure_directory/models.py:37 policy_directory/models.py:37 +msgid "Keywords" +msgstr "" + +#: education_directory/models.py:48 +msgid "Is Online" +msgstr "" + +#: education_directory/models.py:72 education_directory/wagtail_hooks.py:47 +msgid "Education Directory Upload" +msgstr "" + +#: education_directory/models.py:76 event_directory/models.py:79 +#: infrastructure_directory/models.py:59 policy_directory/models.py:60 msgid "Attachement" msgstr "" -#: disclosure_directory/models.py:55 education_directory/models.py:54 -#: infrastructure_directory/models.py:39 policy_directory/models.py:46 +#: education_directory/models.py:81 event_directory/models.py:84 +#: infrastructure_directory/models.py:64 policy_directory/models.py:65 msgid "Is valid?" msgstr "" -#: disclosure_directory/models.py:57 education_directory/models.py:56 -#: infrastructure_directory/models.py:41 policy_directory/models.py:48 +#: education_directory/models.py:83 event_directory/models.py:86 +#: infrastructure_directory/models.py:66 policy_directory/models.py:67 msgid "Number of lines" msgstr "" -#: disclosure_directory/templates/modeladmin/disclosure_directory/disclosuredirectoryfile/index.html:6 #: education_directory/templates/modeladmin/education_directory/educationdirectoryfile/index.html:6 +#: event_directory/templates/modeladmin/event_directory/eventdirectoryfile/index.html:6 #: infrastructure_directory/templates/modeladmin/infrastructure_directory/infrastructuredirectoryfile/index.html:6 #: policy_directory/templates/modeladmin/policy_directory/policydirectoryfile/index.html:6 msgid "Download CSV Example" msgstr "" -#: disclosure_directory/views.py:38 education_directory/views.py:38 -#: infrastructure_directory/views.py:38 policy_directory/views.py:38 +#: education_directory/views.py:40 event_directory/views.py:40 +#: infrastructure_directory/views.py:39 policy_directory/views.py:41 msgid "Valication error" msgstr "" -#: disclosure_directory/views.py:45 education_directory/views.py:45 -#: infrastructure_directory/views.py:45 policy_directory/views.py:45 +#: education_directory/views.py:47 event_directory/views.py:47 +#: infrastructure_directory/views.py:46 policy_directory/views.py:48 #, python-format msgid "Valication error: %s" msgstr "" -#: disclosure_directory/views.py:47 education_directory/views.py:47 -#: infrastructure_directory/views.py:47 policy_directory/views.py:47 +#: education_directory/views.py:49 event_directory/views.py:49 +#: infrastructure_directory/views.py:48 policy_directory/views.py:50 msgid "File successfully validated!" msgstr "" -#: disclosure_directory/views.py:87 education_directory/views.py:87 -#: infrastructure_directory/views.py:82 policy_directory/views.py:84 +#: education_directory/views.py:125 event_directory/views.py:125 +#: infrastructure_directory/views.py:120 policy_directory/views.py:123 +#, python-format +msgid "Unknown pratice, line: %s" +msgstr "" + +#: education_directory/views.py:134 event_directory/views.py:134 +#: infrastructure_directory/views.py:129 policy_directory/views.py:132 +#, python-format +msgid "Unknown action, line: %s" +msgstr "" + +#: education_directory/views.py:138 event_directory/views.py:139 +#: infrastructure_directory/views.py:134 policy_directory/views.py:136 #, python-format msgid "Import error: %s" msgstr "" -#: disclosure_directory/views.py:89 education_directory/views.py:89 -#: infrastructure_directory/views.py:84 policy_directory/views.py:86 +#: education_directory/views.py:140 event_directory/views.py:141 +#: infrastructure_directory/views.py:136 policy_directory/views.py:138 msgid "File imported successfully!" msgstr "" -#: education_directory/models.py:14 education_directory/wagtail_hooks.py:31 -#: education_directory/wagtail_hooks.py:59 -msgid "Education Directory" +#: event_directory/choices.py:13 +msgid "encontro" msgstr "" -#: education_directory/models.py:16 infrastructure_directory/models.py:16 -#: policy_directory/models.py:16 -msgid "Title" +#: event_directory/choices.py:14 +msgid "conferência" msgstr "" -#: education_directory/models.py:20 policy_directory/models.py:18 -msgid "Institution" +#: event_directory/choices.py:15 +msgid "congresso" msgstr "" -#: education_directory/models.py:45 education_directory/wagtail_hooks.py:47 -msgid "Education Directory Upload" +#: event_directory/choices.py:16 +msgid "workshop" +msgstr "" + +#: event_directory/choices.py:17 +msgid "seminário" msgstr "" -#: infrastructure_directory/models.py:14 +#: event_directory/models.py:20 +msgid "EventDirectory Directory" +msgstr "" + +#: event_directory/models.py:22 +msgid "Event" +msgstr "" + +#: event_directory/models.py:26 +msgid "Organization" +msgstr "" + +#: event_directory/models.py:49 +msgid "Attendence" +msgstr "" + +#: event_directory/models.py:75 +msgid "EventDirectory Directory Upload" +msgstr "" + +#: event_directory/wagtail_hooks.py:31 event_directory/wagtail_hooks.py:59 +msgid "Event Directory" +msgstr "" + +#: event_directory/wagtail_hooks.py:47 +msgid "Event Directory Upload" +msgstr "" + +#: infrastructure_directory/choices.py:5 +msgid "Portal" +msgstr "" + +#: infrastructure_directory/choices.py:6 +msgid "Plataforma" +msgstr "" + +#: infrastructure_directory/choices.py:7 +msgid "Servidor" +msgstr "" + +#: infrastructure_directory/choices.py:8 +msgid "Repositório" +msgstr "" + +#: infrastructure_directory/choices.py:9 +msgid "Serviço" +msgstr "" + +#: infrastructure_directory/choices.py:10 +msgid "Outras" +msgstr "" + +#: infrastructure_directory/models.py:19 #: infrastructure_directory/wagtail_hooks.py:31 #: infrastructure_directory/wagtail_hooks.py:59 msgid "Infraestructure Directory" msgstr "" -#: infrastructure_directory/models.py:30 +#: infrastructure_directory/models.py:55 #: infrastructure_directory/wagtail_hooks.py:47 msgid "Infraestructure Directory Upload" msgstr "" -#: location/models.py:11 +#: institution/choices.py:6 +msgid "agência de apoio à pesquisa" +msgstr "" + +#: institution/choices.py:7 +msgid "universidade e instâncias ligadas à universidades" +msgstr "" + +#: institution/choices.py:8 +msgid "empresa ou instituto ligadas ao governo" +msgstr "" + +#: institution/choices.py:9 +msgid "organização privada" +msgstr "" + +#: institution/choices.py:10 +msgid "organização sem fins de lucros" +msgstr "" + +#: institution/choices.py:11 +msgid "sociedade científica, associação pós-graduação, associação profissional" +msgstr "" + +#: institution/models.py:14 msgid "Name" msgstr "" -#: location/models.py:13 +#: institution/models.py:15 +msgid "Institution Type" +msgstr "" + +#: location/models.py:14 location/models.py:28 location/models.py:31 msgid "Region" msgstr "" -#: location/models.py:15 usefulmodels/models.py:18 -#: usefulmodels/wagtail_hooks.py:35 +#: location/models.py:16 location/models.py:28 location/models.py:31 +#: usefulmodels/models.py:20 usefulmodels/wagtail_hooks.py:53 msgid "City" msgstr "" -#: location/models.py:17 usefulmodels/models.py:43 -#: usefulmodels/wagtail_hooks.py:50 +#: location/models.py:18 location/models.py:28 location/models.py:31 +#: usefulmodels/models.py:45 usefulmodels/wagtail_hooks.py:68 msgid "State" msgstr "" -#: location/models.py:19 usefulmodels/models.py:67 -#: usefulmodels/wagtail_hooks.py:65 +#: location/models.py:20 location/models.py:28 location/models.py:31 +#: usefulmodels/models.py:70 usefulmodels/wagtail_hooks.py:83 msgid "Country" msgstr "" -#: location/wagtail_hooks.py:21 -msgid "Location" +#: location/models.py:25 +msgid "Locations" msgstr "" -#: policy_directory/models.py:14 policy_directory/wagtail_hooks.py:31 +#: policy_directory/choices.py:5 +msgid "promoção" +msgstr "" + +#: policy_directory/choices.py:6 +msgid "posicionamento" +msgstr "" + +#: policy_directory/choices.py:7 +msgid "mandato" +msgstr "" + +#: policy_directory/choices.py:8 +msgid "geral" +msgstr "" + +#: policy_directory/models.py:18 policy_directory/wagtail_hooks.py:31 #: policy_directory/wagtail_hooks.py:59 msgid "Policy Directory" msgstr "" -#: policy_directory/models.py:37 policy_directory/wagtail_hooks.py:47 +#: policy_directory/models.py:56 policy_directory/wagtail_hooks.py:47 msgid "Policy Directory Upload" msgstr "" @@ -668,39 +838,299 @@ msgstr "" msgid "Articles Directory" msgstr "" -#: usefulmodels/models.py:15 +#: usefulmodels/choices.py:5 +msgid "Ciências da Vida" +msgstr "" + +#: usefulmodels/choices.py:6 +msgid "Ciências Físicas, Tecnológicas e Multidisciplinares" +msgstr "" + +#: usefulmodels/choices.py:7 +msgid "Humanidades" +msgstr "" + +#: usefulmodels/choices.py:12 +msgid "Ciências Agrárias" +msgstr "" + +#: usefulmodels/choices.py:13 +msgid "Ciências Biológicas" +msgstr "" + +#: usefulmodels/choices.py:14 +msgid "Ciências da Saúde" +msgstr "" + +#: usefulmodels/choices.py:15 +msgid "Ciências Exatas e da Terra" +msgstr "" + +#: usefulmodels/choices.py:16 +msgid "Ciências Humanas" +msgstr "" + +#: usefulmodels/choices.py:17 +msgid "Ciências Sociais Aplicadas" +msgstr "" + +#: usefulmodels/choices.py:18 usefulmodels/choices.py:62 +msgid "Engenharias" +msgstr "" + +#: usefulmodels/choices.py:19 +msgid "Lingüística, Letras e Artes" +msgstr "" + +#: usefulmodels/choices.py:24 +msgid "Ciência de Alimentos" +msgstr "" + +#: usefulmodels/choices.py:25 +msgid "Ciências Agrárias I" +msgstr "" + +#: usefulmodels/choices.py:26 +msgid "Medicina Veterinária" +msgstr "" + +#: usefulmodels/choices.py:27 +msgid "Zootecnia/Recursos Pesqueiros" +msgstr "" + +#: usefulmodels/choices.py:28 +msgid "Biodiversidade" +msgstr "" + +#: usefulmodels/choices.py:29 +msgid "Ciências Biológicas I" +msgstr "" + +#: usefulmodels/choices.py:30 +msgid "Ciências Biológicas II" +msgstr "" + +#: usefulmodels/choices.py:31 +msgid "Ciências Biológicas III" +msgstr "" + +#: usefulmodels/choices.py:32 +msgid "Educação Física" +msgstr "" + +#: usefulmodels/choices.py:33 +msgid "Enfermagem" +msgstr "" + +#: usefulmodels/choices.py:34 +msgid "Farmácia" +msgstr "" + +#: usefulmodels/choices.py:35 +msgid "Medicina I" +msgstr "" + +#: usefulmodels/choices.py:36 +msgid "Medicina II" +msgstr "" + +#: usefulmodels/choices.py:37 +msgid "Medicina III" +msgstr "" + +#: usefulmodels/choices.py:38 +msgid "Nutrição" +msgstr "" + +#: usefulmodels/choices.py:39 +msgid "Odontologia" +msgstr "" + +#: usefulmodels/choices.py:40 +msgid "Saúde Coletiva" +msgstr "" + +#: usefulmodels/choices.py:41 +msgid "Astronomia/Física" +msgstr "" + +#: usefulmodels/choices.py:42 +msgid "Ciências da Computação" +msgstr "" + +#: usefulmodels/choices.py:43 +msgid "Geociências" +msgstr "" + +#: usefulmodels/choices.py:44 +msgid "Matemática/Probabilidade Estatística" +msgstr "" + +#: usefulmodels/choices.py:45 +msgid "Química" +msgstr "" + +#: usefulmodels/choices.py:46 +msgid "Antropologia/Arqueologia" +msgstr "" + +#: usefulmodels/choices.py:47 +msgid "Ciência Política e Relações Internacionais" +msgstr "" + +#: usefulmodels/choices.py:48 +msgid "Ciências da Religião e Teologia" +msgstr "" + +#: usefulmodels/choices.py:49 +msgid "Educação" +msgstr "" + +#: usefulmodels/choices.py:50 +msgid "Filosofia" +msgstr "" + +#: usefulmodels/choices.py:51 +msgid "Geografia" +msgstr "" + +#: usefulmodels/choices.py:52 +msgid "História" +msgstr "" + +#: usefulmodels/choices.py:53 +msgid "Psicologia" +msgstr "" + +#: usefulmodels/choices.py:54 +msgid "Sociologia" +msgstr "" + +#: usefulmodels/choices.py:55 +msgid "Turismo" +msgstr "" + +#: usefulmodels/choices.py:56 +msgid "Arquitetura, Urbanismo e Design" +msgstr "" + +#: usefulmodels/choices.py:57 +msgid "Comunicação e Informação" +msgstr "" + +#: usefulmodels/choices.py:58 +msgid "Direito" +msgstr "" + +#: usefulmodels/choices.py:59 +msgid "Economia" +msgstr "" + +#: usefulmodels/choices.py:60 +msgid "Planejamento Urbano e Regional/Demografia" +msgstr "" + +#: usefulmodels/choices.py:61 +msgid "Serviço Social" +msgstr "" + +#: usefulmodels/choices.py:63 +msgid "Engenharias I" +msgstr "" + +#: usefulmodels/choices.py:64 +msgid "Engenharias II" +msgstr "" + +#: usefulmodels/choices.py:65 +msgid "Engenharias III" +msgstr "" + +#: usefulmodels/choices.py:66 +msgid "Engenharias IV" +msgstr "" + +#: usefulmodels/choices.py:67 +msgid "Artes" +msgstr "" + +#: usefulmodels/choices.py:68 +msgid "Linguística e Literatura" +msgstr "" + +#: usefulmodels/models.py:17 msgid "Name of the city" msgstr "" -#: usefulmodels/models.py:19 +#: usefulmodels/models.py:21 msgid "Cities" msgstr "" -#: usefulmodels/models.py:39 +#: usefulmodels/models.py:41 msgid "Name of the state" msgstr "" -#: usefulmodels/models.py:40 +#: usefulmodels/models.py:42 msgid "Acronym to the state" msgstr "" -#: usefulmodels/models.py:44 +#: usefulmodels/models.py:46 msgid "States" msgstr "" -#: usefulmodels/models.py:63 +#: usefulmodels/models.py:66 msgid "Name of the Country" msgstr "" -#: usefulmodels/models.py:64 +#: usefulmodels/models.py:67 msgid "Acronym to the Country" msgstr "" -#: usefulmodels/models.py:68 +#: usefulmodels/models.py:71 msgid "Countries" msgstr "" -#: usefulmodels/wagtail_hooks.py:78 +#: usefulmodels/models.py:92 +msgid "Level 0" +msgstr "" + +#: usefulmodels/models.py:95 +msgid "Level 1" +msgstr "" + +#: usefulmodels/models.py:98 +msgid "Level 2" +msgstr "" + +#: usefulmodels/models.py:103 +msgid "Thematic Areas" +msgstr "" + +#: usefulmodels/models.py:138 +msgid "Name of the pratice" +msgstr "" + +#: usefulmodels/models.py:139 +msgid "Code of the pratice" +msgstr "" + +#: usefulmodels/models.py:143 +msgid "Pratices" +msgstr "" + +#: usefulmodels/models.py:163 +msgid "Name of the action" +msgstr "" + +#: usefulmodels/models.py:164 +msgid "Code of the action" +msgstr "" + +#: usefulmodels/models.py:168 +msgid "Actions" +msgstr "" + +#: usefulmodels/wagtail_hooks.py:142 msgid "Useful Models" msgstr "" diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po index 1c312dfd..3c1ddaf7 100644 --- a/locale/es/LC_MESSAGES/django.po +++ b/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-08-09 12:20+0000\n" +"POT-Creation-Date: 2022-08-21 20:52+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,11 +18,11 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: config/settings/base.py:374 +#: config/settings/base.py:376 msgid "Sobre o Projeto" msgstr "" -#: config/settings/base.py:376 +#: config/settings/base.py:378 msgid "Notícias" msgstr "" @@ -386,177 +386,347 @@ msgstr "" msgid "Admin settings" msgstr "" -#: disclosure_directory/button_helper.py:15 -#: education_directory/button_helper.py:15 +#: education_directory/button_helper.py:15 event_directory/button_helper.py:15 #: infrastructure_directory/button_helper.py:15 #: policy_directory/button_helper.py:15 msgid "Validate" msgstr "" -#: disclosure_directory/button_helper.py:25 -#: education_directory/button_helper.py:25 +#: education_directory/button_helper.py:25 event_directory/button_helper.py:25 #: infrastructure_directory/button_helper.py:25 #: policy_directory/button_helper.py:25 msgid "Import" msgstr "" -#: disclosure_directory/models.py:14 disclosure_directory/wagtail_hooks.py:31 -#: disclosure_directory/wagtail_hooks.py:59 -msgid "Disclosure Directory" +#: education_directory/choices.py:5 +msgid "curso livre" msgstr "" -#: disclosure_directory/models.py:16 -msgid "Event" +#: education_directory/choices.py:6 +msgid "disciplina de graduação" msgstr "" -#: disclosure_directory/models.py:17 education_directory/models.py:17 -#: infrastructure_directory/models.py:17 policy_directory/models.py:17 -msgid "Link" +#: education_directory/choices.py:7 +msgid "disciplina de lato sensu" msgstr "" -#: disclosure_directory/models.py:18 education_directory/models.py:18 -#: infrastructure_directory/models.py:18 policy_directory/models.py:20 -msgid "Description" +#: education_directory/choices.py:8 +msgid "disciplina de stricto sensu" msgstr "" -#: disclosure_directory/models.py:20 -msgid "Organization" +#: education_directory/choices.py:9 event_directory/choices.py:18 +#: institution/choices.py:12 +msgid "outros" +msgstr "" + +#: education_directory/models.py:20 education_directory/wagtail_hooks.py:31 +#: education_directory/wagtail_hooks.py:59 +msgid "Education Directory" +msgstr "" + +#: education_directory/models.py:22 infrastructure_directory/models.py:21 +#: policy_directory/models.py:20 +msgid "Title" +msgstr "" + +#: education_directory/models.py:23 event_directory/models.py:23 +#: infrastructure_directory/models.py:22 policy_directory/models.py:21 +msgid "Link" +msgstr "" + +#: education_directory/models.py:24 event_directory/models.py:24 +#: infrastructure_directory/models.py:23 policy_directory/models.py:22 +msgid "Description" msgstr "" -#: disclosure_directory/models.py:22 education_directory/models.py:22 -#: policy_directory/models.py:22 +#: education_directory/models.py:26 event_directory/models.py:28 +#: policy_directory/models.py:24 msgid "Start Date" msgstr "" -#: disclosure_directory/models.py:24 education_directory/models.py:24 +#: education_directory/models.py:28 event_directory/models.py:30 msgid "End Date" msgstr "" -#: disclosure_directory/models.py:26 education_directory/models.py:26 -#: education_directory/views.py:107 +#: education_directory/models.py:30 education_directory/views.py:158 +#: event_directory/models.py:32 msgid "Start Time" msgstr "" -#: disclosure_directory/models.py:28 education_directory/models.py:28 -#: education_directory/views.py:109 +#: education_directory/models.py:32 education_directory/views.py:160 +#: event_directory/models.py:34 msgid "End Time" msgstr "" -#: disclosure_directory/models.py:46 disclosure_directory/wagtail_hooks.py:47 -msgid "Disclosure Directory Upload" +#: education_directory/models.py:35 event_directory/models.py:37 +#: institution/models.py:26 institution/models.py:29 location/models.py:24 +#: location/wagtail_hooks.py:21 +msgid "Location" +msgstr "" + +#: education_directory/models.py:36 event_directory/models.py:38 +#: infrastructure_directory/models.py:26 institution/wagtail_hooks.py:20 +#: policy_directory/models.py:27 +msgid "Institution" +msgstr "" + +#: education_directory/models.py:37 event_directory/models.py:39 +#: infrastructure_directory/models.py:27 policy_directory/models.py:28 +#: usefulmodels/models.py:102 usefulmodels/wagtail_hooks.py:98 +msgid "Thematic Area" +msgstr "" + +#: education_directory/models.py:39 event_directory/models.py:41 +#: infrastructure_directory/models.py:29 policy_directory/models.py:30 +#: usefulmodels/models.py:142 usefulmodels/wagtail_hooks.py:113 +msgid "Pratice" +msgstr "" + +#: education_directory/models.py:41 event_directory/models.py:43 +#: infrastructure_directory/models.py:31 policy_directory/models.py:32 +#: usefulmodels/models.py:167 usefulmodels/wagtail_hooks.py:128 +msgid "Action" msgstr "" -#: disclosure_directory/models.py:50 education_directory/models.py:49 -#: infrastructure_directory/models.py:34 policy_directory/models.py:41 +#: education_directory/models.py:43 event_directory/models.py:45 +#: infrastructure_directory/models.py:34 policy_directory/models.py:34 +msgid "Classification" +msgstr "" + +#: education_directory/models.py:46 event_directory/models.py:47 +#: infrastructure_directory/models.py:37 policy_directory/models.py:37 +msgid "Keywords" +msgstr "" + +#: education_directory/models.py:48 +msgid "Is Online" +msgstr "" + +#: education_directory/models.py:72 education_directory/wagtail_hooks.py:47 +msgid "Education Directory Upload" +msgstr "" + +#: education_directory/models.py:76 event_directory/models.py:79 +#: infrastructure_directory/models.py:59 policy_directory/models.py:60 msgid "Attachement" msgstr "" -#: disclosure_directory/models.py:55 education_directory/models.py:54 -#: infrastructure_directory/models.py:39 policy_directory/models.py:46 +#: education_directory/models.py:81 event_directory/models.py:84 +#: infrastructure_directory/models.py:64 policy_directory/models.py:65 msgid "Is valid?" msgstr "" -#: disclosure_directory/models.py:57 education_directory/models.py:56 -#: infrastructure_directory/models.py:41 policy_directory/models.py:48 +#: education_directory/models.py:83 event_directory/models.py:86 +#: infrastructure_directory/models.py:66 policy_directory/models.py:67 msgid "Number of lines" msgstr "" -#: disclosure_directory/templates/modeladmin/disclosure_directory/disclosuredirectoryfile/index.html:6 #: education_directory/templates/modeladmin/education_directory/educationdirectoryfile/index.html:6 +#: event_directory/templates/modeladmin/event_directory/eventdirectoryfile/index.html:6 #: infrastructure_directory/templates/modeladmin/infrastructure_directory/infrastructuredirectoryfile/index.html:6 #: policy_directory/templates/modeladmin/policy_directory/policydirectoryfile/index.html:6 msgid "Download CSV Example" msgstr "" -#: disclosure_directory/views.py:38 education_directory/views.py:38 -#: infrastructure_directory/views.py:38 policy_directory/views.py:38 +#: education_directory/views.py:40 event_directory/views.py:40 +#: infrastructure_directory/views.py:39 policy_directory/views.py:41 msgid "Valication error" msgstr "" -#: disclosure_directory/views.py:45 education_directory/views.py:45 -#: infrastructure_directory/views.py:45 policy_directory/views.py:45 +#: education_directory/views.py:47 event_directory/views.py:47 +#: infrastructure_directory/views.py:46 policy_directory/views.py:48 #, python-format msgid "Valication error: %s" msgstr "" -#: disclosure_directory/views.py:47 education_directory/views.py:47 -#: infrastructure_directory/views.py:47 policy_directory/views.py:47 +#: education_directory/views.py:49 event_directory/views.py:49 +#: infrastructure_directory/views.py:48 policy_directory/views.py:50 msgid "File successfully validated!" msgstr "" -#: disclosure_directory/views.py:87 education_directory/views.py:87 -#: infrastructure_directory/views.py:82 policy_directory/views.py:84 +#: education_directory/views.py:125 event_directory/views.py:125 +#: infrastructure_directory/views.py:120 policy_directory/views.py:123 +#, python-format +msgid "Unknown pratice, line: %s" +msgstr "" + +#: education_directory/views.py:134 event_directory/views.py:134 +#: infrastructure_directory/views.py:129 policy_directory/views.py:132 +#, python-format +msgid "Unknown action, line: %s" +msgstr "" + +#: education_directory/views.py:138 event_directory/views.py:139 +#: infrastructure_directory/views.py:134 policy_directory/views.py:136 #, python-format msgid "Import error: %s" msgstr "" -#: disclosure_directory/views.py:89 education_directory/views.py:89 -#: infrastructure_directory/views.py:84 policy_directory/views.py:86 +#: education_directory/views.py:140 event_directory/views.py:141 +#: infrastructure_directory/views.py:136 policy_directory/views.py:138 msgid "File imported successfully!" msgstr "" -#: education_directory/models.py:14 education_directory/wagtail_hooks.py:31 -#: education_directory/wagtail_hooks.py:59 -msgid "Education Directory" +#: event_directory/choices.py:13 +msgid "encontro" msgstr "" -#: education_directory/models.py:16 infrastructure_directory/models.py:16 -#: policy_directory/models.py:16 -msgid "Title" +#: event_directory/choices.py:14 +msgid "conferência" msgstr "" -#: education_directory/models.py:20 policy_directory/models.py:18 -msgid "Institution" +#: event_directory/choices.py:15 +msgid "congresso" msgstr "" -#: education_directory/models.py:45 education_directory/wagtail_hooks.py:47 -msgid "Education Directory Upload" +#: event_directory/choices.py:16 +msgid "workshop" +msgstr "" + +#: event_directory/choices.py:17 +msgid "seminário" msgstr "" -#: infrastructure_directory/models.py:14 +#: event_directory/models.py:20 +msgid "EventDirectory Directory" +msgstr "" + +#: event_directory/models.py:22 +msgid "Event" +msgstr "" + +#: event_directory/models.py:26 +msgid "Organization" +msgstr "" + +#: event_directory/models.py:49 +msgid "Attendence" +msgstr "" + +#: event_directory/models.py:75 +msgid "EventDirectory Directory Upload" +msgstr "" + +#: event_directory/wagtail_hooks.py:31 event_directory/wagtail_hooks.py:59 +msgid "Event Directory" +msgstr "" + +#: event_directory/wagtail_hooks.py:47 +msgid "Event Directory Upload" +msgstr "" + +#: infrastructure_directory/choices.py:5 +msgid "Portal" +msgstr "" + +#: infrastructure_directory/choices.py:6 +msgid "Plataforma" +msgstr "" + +#: infrastructure_directory/choices.py:7 +msgid "Servidor" +msgstr "" + +#: infrastructure_directory/choices.py:8 +msgid "Repositório" +msgstr "" + +#: infrastructure_directory/choices.py:9 +msgid "Serviço" +msgstr "" + +#: infrastructure_directory/choices.py:10 +msgid "Outras" +msgstr "" + +#: infrastructure_directory/models.py:19 #: infrastructure_directory/wagtail_hooks.py:31 #: infrastructure_directory/wagtail_hooks.py:59 msgid "Infraestructure Directory" msgstr "" -#: infrastructure_directory/models.py:30 +#: infrastructure_directory/models.py:55 #: infrastructure_directory/wagtail_hooks.py:47 msgid "Infraestructure Directory Upload" msgstr "" -#: location/models.py:11 +#: institution/choices.py:6 +msgid "agência de apoio à pesquisa" +msgstr "" + +#: institution/choices.py:7 +msgid "universidade e instâncias ligadas à universidades" +msgstr "" + +#: institution/choices.py:8 +msgid "empresa ou instituto ligadas ao governo" +msgstr "" + +#: institution/choices.py:9 +msgid "organização privada" +msgstr "" + +#: institution/choices.py:10 +msgid "organização sem fins de lucros" +msgstr "" + +#: institution/choices.py:11 +msgid "sociedade científica, associação pós-graduação, associação profissional" +msgstr "" + +#: institution/models.py:14 msgid "Name" msgstr "" -#: location/models.py:13 +#: institution/models.py:15 +msgid "Institution Type" +msgstr "" + +#: location/models.py:14 location/models.py:28 location/models.py:31 msgid "Region" msgstr "" -#: location/models.py:15 usefulmodels/models.py:18 -#: usefulmodels/wagtail_hooks.py:35 +#: location/models.py:16 location/models.py:28 location/models.py:31 +#: usefulmodels/models.py:20 usefulmodels/wagtail_hooks.py:53 msgid "City" msgstr "" -#: location/models.py:17 usefulmodels/models.py:43 -#: usefulmodels/wagtail_hooks.py:50 +#: location/models.py:18 location/models.py:28 location/models.py:31 +#: usefulmodels/models.py:45 usefulmodels/wagtail_hooks.py:68 msgid "State" msgstr "" -#: location/models.py:19 usefulmodels/models.py:67 -#: usefulmodels/wagtail_hooks.py:65 +#: location/models.py:20 location/models.py:28 location/models.py:31 +#: usefulmodels/models.py:70 usefulmodels/wagtail_hooks.py:83 msgid "Country" msgstr "" -#: location/wagtail_hooks.py:21 -msgid "Location" +#: location/models.py:25 +msgid "Locations" msgstr "" -#: policy_directory/models.py:14 policy_directory/wagtail_hooks.py:31 +#: policy_directory/choices.py:5 +msgid "promoção" +msgstr "" + +#: policy_directory/choices.py:6 +msgid "posicionamento" +msgstr "" + +#: policy_directory/choices.py:7 +msgid "mandato" +msgstr "" + +#: policy_directory/choices.py:8 +msgid "geral" +msgstr "" + +#: policy_directory/models.py:18 policy_directory/wagtail_hooks.py:31 #: policy_directory/wagtail_hooks.py:59 msgid "Policy Directory" msgstr "" -#: policy_directory/models.py:37 policy_directory/wagtail_hooks.py:47 +#: policy_directory/models.py:56 policy_directory/wagtail_hooks.py:47 msgid "Policy Directory Upload" msgstr "" @@ -668,38 +838,298 @@ msgstr "" msgid "Articles Directory" msgstr "" -#: usefulmodels/models.py:15 +#: usefulmodels/choices.py:5 +msgid "Ciências da Vida" +msgstr "" + +#: usefulmodels/choices.py:6 +msgid "Ciências Físicas, Tecnológicas e Multidisciplinares" +msgstr "" + +#: usefulmodels/choices.py:7 +msgid "Humanidades" +msgstr "" + +#: usefulmodels/choices.py:12 +msgid "Ciências Agrárias" +msgstr "" + +#: usefulmodels/choices.py:13 +msgid "Ciências Biológicas" +msgstr "" + +#: usefulmodels/choices.py:14 +msgid "Ciências da Saúde" +msgstr "" + +#: usefulmodels/choices.py:15 +msgid "Ciências Exatas e da Terra" +msgstr "" + +#: usefulmodels/choices.py:16 +msgid "Ciências Humanas" +msgstr "" + +#: usefulmodels/choices.py:17 +msgid "Ciências Sociais Aplicadas" +msgstr "" + +#: usefulmodels/choices.py:18 usefulmodels/choices.py:62 +msgid "Engenharias" +msgstr "" + +#: usefulmodels/choices.py:19 +msgid "Lingüística, Letras e Artes" +msgstr "" + +#: usefulmodels/choices.py:24 +msgid "Ciência de Alimentos" +msgstr "" + +#: usefulmodels/choices.py:25 +msgid "Ciências Agrárias I" +msgstr "" + +#: usefulmodels/choices.py:26 +msgid "Medicina Veterinária" +msgstr "" + +#: usefulmodels/choices.py:27 +msgid "Zootecnia/Recursos Pesqueiros" +msgstr "" + +#: usefulmodels/choices.py:28 +msgid "Biodiversidade" +msgstr "" + +#: usefulmodels/choices.py:29 +msgid "Ciências Biológicas I" +msgstr "" + +#: usefulmodels/choices.py:30 +msgid "Ciências Biológicas II" +msgstr "" + +#: usefulmodels/choices.py:31 +msgid "Ciências Biológicas III" +msgstr "" + +#: usefulmodels/choices.py:32 +msgid "Educação Física" +msgstr "" + +#: usefulmodels/choices.py:33 +msgid "Enfermagem" +msgstr "" + +#: usefulmodels/choices.py:34 +msgid "Farmácia" +msgstr "" + +#: usefulmodels/choices.py:35 +msgid "Medicina I" +msgstr "" + +#: usefulmodels/choices.py:36 +msgid "Medicina II" +msgstr "" + +#: usefulmodels/choices.py:37 +msgid "Medicina III" +msgstr "" + +#: usefulmodels/choices.py:38 +msgid "Nutrição" +msgstr "" + +#: usefulmodels/choices.py:39 +msgid "Odontologia" +msgstr "" + +#: usefulmodels/choices.py:40 +msgid "Saúde Coletiva" +msgstr "" + +#: usefulmodels/choices.py:41 +msgid "Astronomia/Física" +msgstr "" + +#: usefulmodels/choices.py:42 +msgid "Ciências da Computação" +msgstr "" + +#: usefulmodels/choices.py:43 +msgid "Geociências" +msgstr "" + +#: usefulmodels/choices.py:44 +msgid "Matemática/Probabilidade Estatística" +msgstr "" + +#: usefulmodels/choices.py:45 +msgid "Química" +msgstr "" + +#: usefulmodels/choices.py:46 +msgid "Antropologia/Arqueologia" +msgstr "" + +#: usefulmodels/choices.py:47 +msgid "Ciência Política e Relações Internacionais" +msgstr "" + +#: usefulmodels/choices.py:48 +msgid "Ciências da Religião e Teologia" +msgstr "" + +#: usefulmodels/choices.py:49 +msgid "Educação" +msgstr "" + +#: usefulmodels/choices.py:50 +msgid "Filosofia" +msgstr "" + +#: usefulmodels/choices.py:51 +msgid "Geografia" +msgstr "" + +#: usefulmodels/choices.py:52 +msgid "História" +msgstr "" + +#: usefulmodels/choices.py:53 +msgid "Psicologia" +msgstr "" + +#: usefulmodels/choices.py:54 +msgid "Sociologia" +msgstr "" + +#: usefulmodels/choices.py:55 +msgid "Turismo" +msgstr "" + +#: usefulmodels/choices.py:56 +msgid "Arquitetura, Urbanismo e Design" +msgstr "" + +#: usefulmodels/choices.py:57 +msgid "Comunicação e Informação" +msgstr "" + +#: usefulmodels/choices.py:58 +msgid "Direito" +msgstr "" + +#: usefulmodels/choices.py:59 +msgid "Economia" +msgstr "" + +#: usefulmodels/choices.py:60 +msgid "Planejamento Urbano e Regional/Demografia" +msgstr "" + +#: usefulmodels/choices.py:61 +msgid "Serviço Social" +msgstr "" + +#: usefulmodels/choices.py:63 +msgid "Engenharias I" +msgstr "" + +#: usefulmodels/choices.py:64 +msgid "Engenharias II" +msgstr "" + +#: usefulmodels/choices.py:65 +msgid "Engenharias III" +msgstr "" + +#: usefulmodels/choices.py:66 +msgid "Engenharias IV" +msgstr "" + +#: usefulmodels/choices.py:67 +msgid "Artes" +msgstr "" + +#: usefulmodels/choices.py:68 +msgid "Linguística e Literatura" +msgstr "" + +#: usefulmodels/models.py:17 msgid "Name of the city" msgstr "" -#: usefulmodels/models.py:19 +#: usefulmodels/models.py:21 msgid "Cities" msgstr "" -#: usefulmodels/models.py:39 +#: usefulmodels/models.py:41 msgid "Name of the state" msgstr "" -#: usefulmodels/models.py:40 +#: usefulmodels/models.py:42 msgid "Acronym to the state" msgstr "" -#: usefulmodels/models.py:44 +#: usefulmodels/models.py:46 msgid "States" msgstr "" -#: usefulmodels/models.py:63 +#: usefulmodels/models.py:66 msgid "Name of the Country" msgstr "" -#: usefulmodels/models.py:64 +#: usefulmodels/models.py:67 msgid "Acronym to the Country" msgstr "" -#: usefulmodels/models.py:68 +#: usefulmodels/models.py:71 msgid "Countries" msgstr "" -#: usefulmodels/wagtail_hooks.py:78 +#: usefulmodels/models.py:92 +msgid "Level 0" +msgstr "" + +#: usefulmodels/models.py:95 +msgid "Level 1" +msgstr "" + +#: usefulmodels/models.py:98 +msgid "Level 2" +msgstr "" + +#: usefulmodels/models.py:103 +msgid "Thematic Areas" +msgstr "" + +#: usefulmodels/models.py:138 +msgid "Name of the pratice" +msgstr "" + +#: usefulmodels/models.py:139 +msgid "Code of the pratice" +msgstr "" + +#: usefulmodels/models.py:143 +msgid "Pratices" +msgstr "" + +#: usefulmodels/models.py:163 +msgid "Name of the action" +msgstr "" + +#: usefulmodels/models.py:164 +msgid "Code of the action" +msgstr "" + +#: usefulmodels/models.py:168 +msgid "Actions" +msgstr "" + +#: usefulmodels/wagtail_hooks.py:142 msgid "Useful Models" msgstr "" diff --git a/locale/pt_BR/LC_MESSAGES/django.mo b/locale/pt_BR/LC_MESSAGES/django.mo index 9a6d57eb..10cca704 100644 Binary files a/locale/pt_BR/LC_MESSAGES/django.mo and b/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/locale/pt_BR/LC_MESSAGES/django.po b/locale/pt_BR/LC_MESSAGES/django.po index ec703f07..2236dbb5 100644 --- a/locale/pt_BR/LC_MESSAGES/django.po +++ b/locale/pt_BR/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-08-09 12:20+0000\n" +"POT-Creation-Date: 2022-08-21 20:52+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,11 +18,11 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: config/settings/base.py:374 +#: config/settings/base.py:376 msgid "Sobre o Projeto" msgstr "Sobre o Projeto" -#: config/settings/base.py:376 +#: config/settings/base.py:378 msgid "Notícias" msgstr "Notícias" @@ -386,177 +386,361 @@ msgstr "Configuração do site" msgid "Admin settings" msgstr "Configuração" -#: disclosure_directory/button_helper.py:15 -#: education_directory/button_helper.py:15 +#: education_directory/button_helper.py:15 event_directory/button_helper.py:15 #: infrastructure_directory/button_helper.py:15 #: policy_directory/button_helper.py:15 msgid "Validate" msgstr "Validar" -#: disclosure_directory/button_helper.py:25 -#: education_directory/button_helper.py:25 +#: education_directory/button_helper.py:25 event_directory/button_helper.py:25 #: infrastructure_directory/button_helper.py:25 #: policy_directory/button_helper.py:25 msgid "Import" msgstr "Importar" -#: disclosure_directory/models.py:14 disclosure_directory/wagtail_hooks.py:31 -#: disclosure_directory/wagtail_hooks.py:59 -msgid "Disclosure Directory" -msgstr "Diretório de Eventos" +#: education_directory/choices.py:5 +msgid "curso livre" +msgstr "" -#: disclosure_directory/models.py:16 -msgid "Event" -msgstr "Evento" +#: education_directory/choices.py:6 +msgid "disciplina de graduação" +msgstr "" + +#: education_directory/choices.py:7 +msgid "disciplina de lato sensu" +msgstr "" + +#: education_directory/choices.py:8 +msgid "disciplina de stricto sensu" +msgstr "" + +#: education_directory/choices.py:9 event_directory/choices.py:18 +#: institution/choices.py:12 +msgid "outros" +msgstr "" -#: disclosure_directory/models.py:17 education_directory/models.py:17 -#: infrastructure_directory/models.py:17 policy_directory/models.py:17 +#: education_directory/models.py:20 education_directory/wagtail_hooks.py:31 +#: education_directory/wagtail_hooks.py:59 +msgid "Education Directory" +msgstr "Diretório de Educação" + +#: education_directory/models.py:22 infrastructure_directory/models.py:21 +#: policy_directory/models.py:20 +msgid "Title" +msgstr "Título" + +#: education_directory/models.py:23 event_directory/models.py:23 +#: infrastructure_directory/models.py:22 policy_directory/models.py:21 msgid "Link" msgstr "Link" -#: disclosure_directory/models.py:18 education_directory/models.py:18 -#: infrastructure_directory/models.py:18 policy_directory/models.py:20 +#: education_directory/models.py:24 event_directory/models.py:24 +#: infrastructure_directory/models.py:23 policy_directory/models.py:22 msgid "Description" msgstr "Descrição" -#: disclosure_directory/models.py:20 -msgid "Organization" -msgstr "Organização" - -#: disclosure_directory/models.py:22 education_directory/models.py:22 -#: policy_directory/models.py:22 +#: education_directory/models.py:26 event_directory/models.py:28 +#: policy_directory/models.py:24 msgid "Start Date" msgstr "Data de início" -#: disclosure_directory/models.py:24 education_directory/models.py:24 +#: education_directory/models.py:28 event_directory/models.py:30 msgid "End Date" msgstr "Data de fim" -#: disclosure_directory/models.py:26 education_directory/models.py:26 -#: education_directory/views.py:107 +#: education_directory/models.py:30 education_directory/views.py:158 +#: event_directory/models.py:32 msgid "Start Time" msgstr "Hora inicial" -#: disclosure_directory/models.py:28 education_directory/models.py:28 -#: education_directory/views.py:109 +#: education_directory/models.py:32 education_directory/views.py:160 +#: event_directory/models.py:34 msgid "End Time" msgstr "Hora final" -#: disclosure_directory/models.py:46 disclosure_directory/wagtail_hooks.py:47 -msgid "Disclosure Directory Upload" -msgstr "Diretório de Eventos Upload" +#: education_directory/models.py:35 event_directory/models.py:37 +#: institution/models.py:26 institution/models.py:29 location/models.py:24 +#: location/wagtail_hooks.py:21 +msgid "Location" +msgstr "Localização" -#: disclosure_directory/models.py:50 education_directory/models.py:49 -#: infrastructure_directory/models.py:34 policy_directory/models.py:41 +#: education_directory/models.py:36 event_directory/models.py:38 +#: infrastructure_directory/models.py:26 institution/wagtail_hooks.py:20 +#: policy_directory/models.py:27 +msgid "Institution" +msgstr "Instituição" + +#: education_directory/models.py:37 event_directory/models.py:39 +#: infrastructure_directory/models.py:27 policy_directory/models.py:28 +#: usefulmodels/models.py:102 usefulmodels/wagtail_hooks.py:98 +msgid "Thematic Area" +msgstr "Área temática" + +#: education_directory/models.py:39 event_directory/models.py:41 +#: infrastructure_directory/models.py:29 policy_directory/models.py:30 +#: usefulmodels/models.py:142 usefulmodels/wagtail_hooks.py:113 +msgid "Pratice" +msgstr "Prática" + +#: education_directory/models.py:41 event_directory/models.py:43 +#: infrastructure_directory/models.py:31 policy_directory/models.py:32 +#: usefulmodels/models.py:167 usefulmodels/wagtail_hooks.py:128 +#, fuzzy +#| msgid "Location" +msgid "Action" +msgstr "Localização" + +#: education_directory/models.py:43 event_directory/models.py:45 +#: infrastructure_directory/models.py:34 policy_directory/models.py:34 +msgid "Classification" +msgstr "Classificação" + +#: education_directory/models.py:46 event_directory/models.py:47 +#: infrastructure_directory/models.py:37 policy_directory/models.py:37 +msgid "Keywords" +msgstr "Palavra-chave" + +#: education_directory/models.py:48 +msgid "Is Online" +msgstr "É Online" + +#: education_directory/models.py:72 education_directory/wagtail_hooks.py:47 +msgid "Education Directory Upload" +msgstr "Diretório de Educação Upload" + +#: education_directory/models.py:76 event_directory/models.py:79 +#: infrastructure_directory/models.py:59 policy_directory/models.py:60 msgid "Attachement" msgstr "Anexo" -#: disclosure_directory/models.py:55 education_directory/models.py:54 -#: infrastructure_directory/models.py:39 policy_directory/models.py:46 +#: education_directory/models.py:81 event_directory/models.py:84 +#: infrastructure_directory/models.py:64 policy_directory/models.py:65 msgid "Is valid?" msgstr "É válido" -#: disclosure_directory/models.py:57 education_directory/models.py:56 -#: infrastructure_directory/models.py:41 policy_directory/models.py:48 +#: education_directory/models.py:83 event_directory/models.py:86 +#: infrastructure_directory/models.py:66 policy_directory/models.py:67 msgid "Number of lines" msgstr "Número de linhas" -#: disclosure_directory/templates/modeladmin/disclosure_directory/disclosuredirectoryfile/index.html:6 #: education_directory/templates/modeladmin/education_directory/educationdirectoryfile/index.html:6 +#: event_directory/templates/modeladmin/event_directory/eventdirectoryfile/index.html:6 #: infrastructure_directory/templates/modeladmin/infrastructure_directory/infrastructuredirectoryfile/index.html:6 #: policy_directory/templates/modeladmin/policy_directory/policydirectoryfile/index.html:6 msgid "Download CSV Example" msgstr "Download CSV de exemplo" -#: disclosure_directory/views.py:38 education_directory/views.py:38 -#: infrastructure_directory/views.py:38 policy_directory/views.py:38 +#: education_directory/views.py:40 event_directory/views.py:40 +#: infrastructure_directory/views.py:39 policy_directory/views.py:41 msgid "Valication error" msgstr "Erro de validação" -#: disclosure_directory/views.py:45 education_directory/views.py:45 -#: infrastructure_directory/views.py:45 policy_directory/views.py:45 +#: education_directory/views.py:47 event_directory/views.py:47 +#: infrastructure_directory/views.py:46 policy_directory/views.py:48 #, python-format msgid "Valication error: %s" msgstr "Erro de validação: %s" -#: disclosure_directory/views.py:47 education_directory/views.py:47 -#: infrastructure_directory/views.py:47 policy_directory/views.py:47 +#: education_directory/views.py:49 event_directory/views.py:49 +#: infrastructure_directory/views.py:48 policy_directory/views.py:50 msgid "File successfully validated!" msgstr "Arquivo validado com sucesso!" -#: disclosure_directory/views.py:87 education_directory/views.py:87 -#: infrastructure_directory/views.py:82 policy_directory/views.py:84 +#: education_directory/views.py:125 event_directory/views.py:125 +#: infrastructure_directory/views.py:120 policy_directory/views.py:123 +#, python-format +msgid "Unknown pratice, line: %s" +msgstr "Prática desconhecida, linha: %s " + +#: education_directory/views.py:134 event_directory/views.py:134 +#: infrastructure_directory/views.py:129 policy_directory/views.py:132 +#, python-format +msgid "Unknown action, line: %s" +msgstr "Ação desconhecida, linha: %s" + +#: education_directory/views.py:138 event_directory/views.py:139 +#: infrastructure_directory/views.py:134 policy_directory/views.py:136 #, python-format msgid "Import error: %s" msgstr "Erro na importação: %s" -#: disclosure_directory/views.py:89 education_directory/views.py:89 -#: infrastructure_directory/views.py:84 policy_directory/views.py:86 +#: education_directory/views.py:140 event_directory/views.py:141 +#: infrastructure_directory/views.py:136 policy_directory/views.py:138 msgid "File imported successfully!" msgstr "Arquivo importado com sucesso!" -#: education_directory/models.py:14 education_directory/wagtail_hooks.py:31 -#: education_directory/wagtail_hooks.py:59 -msgid "Education Directory" -msgstr "Diretório de Educação" +#: event_directory/choices.py:13 +msgid "encontro" +msgstr "" -#: education_directory/models.py:16 infrastructure_directory/models.py:16 -#: policy_directory/models.py:16 -msgid "Title" -msgstr "Título" +#: event_directory/choices.py:14 +msgid "conferência" +msgstr "" -#: education_directory/models.py:20 policy_directory/models.py:18 -msgid "Institution" -msgstr "Instituição" +#: event_directory/choices.py:15 +msgid "congresso" +msgstr "" -#: education_directory/models.py:45 education_directory/wagtail_hooks.py:47 -msgid "Education Directory Upload" +#: event_directory/choices.py:16 +msgid "workshop" +msgstr "" + +#: event_directory/choices.py:17 +msgid "seminário" +msgstr "" + +#: event_directory/models.py:20 +#, fuzzy +#| msgid "Disclosure Directory" +msgid "EventDirectory Directory" +msgstr "Diretório de Eventos" + +#: event_directory/models.py:22 +msgid "Event" +msgstr "Evento" + +#: event_directory/models.py:26 +msgid "Organization" +msgstr "Organização" + +#: event_directory/models.py:49 +msgid "Attendence" +msgstr "Presença" + +#: event_directory/models.py:75 +#, fuzzy +#| msgid "Disclosure Directory Upload" +msgid "EventDirectory Directory Upload" +msgstr "Diretório de Eventos Upload" + +#: event_directory/wagtail_hooks.py:31 event_directory/wagtail_hooks.py:59 +#, fuzzy +#| msgid "Education Directory" +msgid "Event Directory" +msgstr "Diretório de Educação" + +#: event_directory/wagtail_hooks.py:47 +#, fuzzy +#| msgid "Education Directory Upload" +msgid "Event Directory Upload" msgstr "Diretório de Educação Upload" -#: infrastructure_directory/models.py:14 +#: infrastructure_directory/choices.py:5 +msgid "Portal" +msgstr "" + +#: infrastructure_directory/choices.py:6 +msgid "Plataforma" +msgstr "" + +#: infrastructure_directory/choices.py:7 +msgid "Servidor" +msgstr "" + +#: infrastructure_directory/choices.py:8 +msgid "Repositório" +msgstr "" + +#: infrastructure_directory/choices.py:9 +msgid "Serviço" +msgstr "" + +#: infrastructure_directory/choices.py:10 +msgid "Outras" +msgstr "" + +#: infrastructure_directory/models.py:19 #: infrastructure_directory/wagtail_hooks.py:31 #: infrastructure_directory/wagtail_hooks.py:59 msgid "Infraestructure Directory" msgstr "Diretório de Infraestrutura" -#: infrastructure_directory/models.py:30 +#: infrastructure_directory/models.py:55 #: infrastructure_directory/wagtail_hooks.py:47 msgid "Infraestructure Directory Upload" msgstr "Diretório de Infraestrutura Upload" -#: location/models.py:11 +#: institution/choices.py:6 +msgid "agência de apoio à pesquisa" +msgstr "" + +#: institution/choices.py:7 +msgid "universidade e instâncias ligadas à universidades" +msgstr "" + +#: institution/choices.py:8 +msgid "empresa ou instituto ligadas ao governo" +msgstr "" + +#: institution/choices.py:9 +msgid "organização privada" +msgstr "" + +#: institution/choices.py:10 +msgid "organização sem fins de lucros" +msgstr "" + +#: institution/choices.py:11 +msgid "sociedade científica, associação pós-graduação, associação profissional" +msgstr "" + +#: institution/models.py:14 msgid "Name" msgstr "Nome" -#: location/models.py:13 +#: institution/models.py:15 +#, fuzzy +#| msgid "Institution" +msgid "Institution Type" +msgstr "Instituição" + +#: location/models.py:14 location/models.py:28 location/models.py:31 msgid "Region" msgstr "Região" -#: location/models.py:15 usefulmodels/models.py:18 -#: usefulmodels/wagtail_hooks.py:35 +#: location/models.py:16 location/models.py:28 location/models.py:31 +#: usefulmodels/models.py:20 usefulmodels/wagtail_hooks.py:53 msgid "City" msgstr "Cidade" -#: location/models.py:17 usefulmodels/models.py:43 -#: usefulmodels/wagtail_hooks.py:50 +#: location/models.py:18 location/models.py:28 location/models.py:31 +#: usefulmodels/models.py:45 usefulmodels/wagtail_hooks.py:68 msgid "State" msgstr "Estado" -#: location/models.py:19 usefulmodels/models.py:67 -#: usefulmodels/wagtail_hooks.py:65 +#: location/models.py:20 location/models.py:28 location/models.py:31 +#: usefulmodels/models.py:70 usefulmodels/wagtail_hooks.py:83 msgid "Country" msgstr "País" -#: location/wagtail_hooks.py:21 -msgid "Location" +#: location/models.py:25 +#, fuzzy +#| msgid "Location" +msgid "Locations" msgstr "Localização" -#: policy_directory/models.py:14 policy_directory/wagtail_hooks.py:31 +#: policy_directory/choices.py:5 +msgid "promoção" +msgstr "" + +#: policy_directory/choices.py:6 +msgid "posicionamento" +msgstr "" + +#: policy_directory/choices.py:7 +msgid "mandato" +msgstr "" + +#: policy_directory/choices.py:8 +msgid "geral" +msgstr "" + +#: policy_directory/models.py:18 policy_directory/wagtail_hooks.py:31 #: policy_directory/wagtail_hooks.py:59 msgid "Policy Directory" msgstr "Diretório de Política" -#: policy_directory/models.py:37 policy_directory/wagtail_hooks.py:47 +#: policy_directory/models.py:56 policy_directory/wagtail_hooks.py:47 msgid "Policy Directory Upload" msgstr "Diretório de Política Upload" @@ -668,38 +852,308 @@ msgstr "Erros" msgid "Articles Directory" msgstr "Diretório de artigos" -#: usefulmodels/models.py:15 +#: usefulmodels/choices.py:5 +msgid "Ciências da Vida" +msgstr "" + +#: usefulmodels/choices.py:6 +msgid "Ciências Físicas, Tecnológicas e Multidisciplinares" +msgstr "" + +#: usefulmodels/choices.py:7 +msgid "Humanidades" +msgstr "" + +#: usefulmodels/choices.py:12 +msgid "Ciências Agrárias" +msgstr "" + +#: usefulmodels/choices.py:13 +msgid "Ciências Biológicas" +msgstr "" + +#: usefulmodels/choices.py:14 +msgid "Ciências da Saúde" +msgstr "" + +#: usefulmodels/choices.py:15 +msgid "Ciências Exatas e da Terra" +msgstr "" + +#: usefulmodels/choices.py:16 +msgid "Ciências Humanas" +msgstr "" + +#: usefulmodels/choices.py:17 +msgid "Ciências Sociais Aplicadas" +msgstr "" + +#: usefulmodels/choices.py:18 usefulmodels/choices.py:62 +msgid "Engenharias" +msgstr "" + +#: usefulmodels/choices.py:19 +msgid "Lingüística, Letras e Artes" +msgstr "" + +#: usefulmodels/choices.py:24 +msgid "Ciência de Alimentos" +msgstr "" + +#: usefulmodels/choices.py:25 +msgid "Ciências Agrárias I" +msgstr "" + +#: usefulmodels/choices.py:26 +msgid "Medicina Veterinária" +msgstr "" + +#: usefulmodels/choices.py:27 +msgid "Zootecnia/Recursos Pesqueiros" +msgstr "" + +#: usefulmodels/choices.py:28 +msgid "Biodiversidade" +msgstr "" + +#: usefulmodels/choices.py:29 +msgid "Ciências Biológicas I" +msgstr "" + +#: usefulmodels/choices.py:30 +msgid "Ciências Biológicas II" +msgstr "" + +#: usefulmodels/choices.py:31 +msgid "Ciências Biológicas III" +msgstr "" + +#: usefulmodels/choices.py:32 +msgid "Educação Física" +msgstr "" + +#: usefulmodels/choices.py:33 +msgid "Enfermagem" +msgstr "" + +#: usefulmodels/choices.py:34 +msgid "Farmácia" +msgstr "" + +#: usefulmodels/choices.py:35 +msgid "Medicina I" +msgstr "" + +#: usefulmodels/choices.py:36 +msgid "Medicina II" +msgstr "" + +#: usefulmodels/choices.py:37 +msgid "Medicina III" +msgstr "" + +#: usefulmodels/choices.py:38 +msgid "Nutrição" +msgstr "" + +#: usefulmodels/choices.py:39 +msgid "Odontologia" +msgstr "" + +#: usefulmodels/choices.py:40 +msgid "Saúde Coletiva" +msgstr "" + +#: usefulmodels/choices.py:41 +msgid "Astronomia/Física" +msgstr "" + +#: usefulmodels/choices.py:42 +msgid "Ciências da Computação" +msgstr "" + +#: usefulmodels/choices.py:43 +msgid "Geociências" +msgstr "" + +#: usefulmodels/choices.py:44 +msgid "Matemática/Probabilidade Estatística" +msgstr "" + +#: usefulmodels/choices.py:45 +msgid "Química" +msgstr "" + +#: usefulmodels/choices.py:46 +msgid "Antropologia/Arqueologia" +msgstr "" + +#: usefulmodels/choices.py:47 +msgid "Ciência Política e Relações Internacionais" +msgstr "" + +#: usefulmodels/choices.py:48 +msgid "Ciências da Religião e Teologia" +msgstr "" + +#: usefulmodels/choices.py:49 +msgid "Educação" +msgstr "" + +#: usefulmodels/choices.py:50 +msgid "Filosofia" +msgstr "" + +#: usefulmodels/choices.py:51 +msgid "Geografia" +msgstr "" + +#: usefulmodels/choices.py:52 +msgid "História" +msgstr "" + +#: usefulmodels/choices.py:53 +msgid "Psicologia" +msgstr "" + +#: usefulmodels/choices.py:54 +msgid "Sociologia" +msgstr "" + +#: usefulmodels/choices.py:55 +msgid "Turismo" +msgstr "" + +#: usefulmodels/choices.py:56 +msgid "Arquitetura, Urbanismo e Design" +msgstr "" + +#: usefulmodels/choices.py:57 +msgid "Comunicação e Informação" +msgstr "" + +#: usefulmodels/choices.py:58 +msgid "Direito" +msgstr "" + +#: usefulmodels/choices.py:59 +msgid "Economia" +msgstr "" + +#: usefulmodels/choices.py:60 +msgid "Planejamento Urbano e Regional/Demografia" +msgstr "" + +#: usefulmodels/choices.py:61 +msgid "Serviço Social" +msgstr "" + +#: usefulmodels/choices.py:63 +msgid "Engenharias I" +msgstr "" + +#: usefulmodels/choices.py:64 +msgid "Engenharias II" +msgstr "" + +#: usefulmodels/choices.py:65 +msgid "Engenharias III" +msgstr "" + +#: usefulmodels/choices.py:66 +msgid "Engenharias IV" +msgstr "" + +#: usefulmodels/choices.py:67 +msgid "Artes" +msgstr "" + +#: usefulmodels/choices.py:68 +msgid "Linguística e Literatura" +msgstr "" + +#: usefulmodels/models.py:17 msgid "Name of the city" msgstr "Nome da cidade" -#: usefulmodels/models.py:19 +#: usefulmodels/models.py:21 msgid "Cities" msgstr "Cidades" -#: usefulmodels/models.py:39 +#: usefulmodels/models.py:41 msgid "Name of the state" msgstr "Nome do estado" -#: usefulmodels/models.py:40 +#: usefulmodels/models.py:42 msgid "Acronym to the state" msgstr "Acrônimo do estado" -#: usefulmodels/models.py:44 +#: usefulmodels/models.py:46 msgid "States" msgstr "Estados" -#: usefulmodels/models.py:63 +#: usefulmodels/models.py:66 msgid "Name of the Country" msgstr "Nome do País" -#: usefulmodels/models.py:64 +#: usefulmodels/models.py:67 msgid "Acronym to the Country" msgstr "Acrônimo do país" -#: usefulmodels/models.py:68 +#: usefulmodels/models.py:71 msgid "Countries" msgstr "Países" -#: usefulmodels/wagtail_hooks.py:78 +#: usefulmodels/models.py:92 +msgid "Level 0" +msgstr "Nível 0" + +#: usefulmodels/models.py:95 +msgid "Level 1" +msgstr "Nível 1" + +#: usefulmodels/models.py:98 +msgid "Level 2" +msgstr "Nível 2" + +#: usefulmodels/models.py:103 +msgid "Thematic Areas" +msgstr "Áreas temáticas" + +#: usefulmodels/models.py:138 +#, fuzzy +#| msgid "Name of the state" +msgid "Name of the pratice" +msgstr "Nome do estado" + +#: usefulmodels/models.py:139 +#, fuzzy +#| msgid "Name of the state" +msgid "Code of the pratice" +msgstr "Nome do estado" + +#: usefulmodels/models.py:143 +msgid "Pratices" +msgstr "Práticas" + +#: usefulmodels/models.py:163 +#, fuzzy +#| msgid "Name of the city" +msgid "Name of the action" +msgstr "Nome da cidade" + +#: usefulmodels/models.py:164 +#, fuzzy +#| msgid "Name of the city" +msgid "Code of the action" +msgstr "Nome da cidade" + +#: usefulmodels/models.py:168 +#, fuzzy +#| msgid "Location" +msgid "Actions" +msgstr "Localização" + +#: usefulmodels/wagtail_hooks.py:142 msgid "Useful Models" msgstr "Modelos Úteis" diff --git a/location/choices.py b/location/choices.py index d162ddaf..bd3f215d 100644 --- a/location/choices.py +++ b/location/choices.py @@ -1,7 +1,7 @@ regions = ( ('', ''), - ('Norte','Norte'), + ('Norte', 'Norte'), ('Nordeste', 'Nordeste'), ('Centro-Oeste', 'Centro-Oeste'), ('Sudeste', 'Sudeste' ), diff --git a/location/migrations/0004_auto_20220815_1203.py b/location/migrations/0004_auto_20220815_1203.py new file mode 100644 index 00000000..00e2c1f7 --- /dev/null +++ b/location/migrations/0004_auto_20220815_1203.py @@ -0,0 +1,40 @@ +# Generated by Django 3.2.12 on 2022-08-15 12:03 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('usefulmodels', '0004_auto_20220815_1203'), + ('location', '0003_alter_location_name'), + ] + + operations = [ + migrations.AddField( + model_name='location', + name='sort_order', + field=models.IntegerField(blank=True, editable=False, null=True), + ), + migrations.AlterField( + model_name='location', + name='city', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='usefulmodels.city', verbose_name='Cidade'), + ), + migrations.AlterField( + model_name='location', + name='country', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='usefulmodels.country', verbose_name='País'), + ), + migrations.AlterField( + model_name='location', + name='region', + field=models.CharField(blank=True, choices=[('', ''), ('Norte', 'Norte'), ('Nordeste', 'Nordeste'), ('Centro-Oeste', 'Centro-Oeste'), ('Sudeste', 'Sudeste'), ('Sul', 'Sul')], max_length=255, null=True, verbose_name='Região'), + ), + migrations.AlterField( + model_name='location', + name='state', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='usefulmodels.state', verbose_name='Estado'), + ), + ] diff --git a/location/migrations/0005_location_institution.py b/location/migrations/0005_location_institution.py new file mode 100644 index 00000000..8f6b8e48 --- /dev/null +++ b/location/migrations/0005_location_institution.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.12 on 2022-08-15 12:21 + +from django.db import migrations +import django.db.models.deletion +import modelcluster.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('institution', '0001_initial'), + ('location', '0004_auto_20220815_1203'), + ] + + operations = [ + migrations.AddField( + model_name='location', + name='institution', + field=modelcluster.fields.ParentalKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='locations', to='institution.institution'), + ), + ] diff --git a/location/migrations/0006_alter_location_institution.py b/location/migrations/0006_alter_location_institution.py new file mode 100644 index 00000000..d773c4a3 --- /dev/null +++ b/location/migrations/0006_alter_location_institution.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.12 on 2022-08-15 12:26 + +from django.db import migrations +import django.db.models.deletion +import modelcluster.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('institution', '0001_initial'), + ('location', '0005_location_institution'), + ] + + operations = [ + migrations.AlterField( + model_name='location', + name='institution', + field=modelcluster.fields.ParentalKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='locations', to='institution.institution'), + ), + ] diff --git a/location/migrations/0007_remove_location_institution.py b/location/migrations/0007_remove_location_institution.py new file mode 100644 index 00000000..2e4376e2 --- /dev/null +++ b/location/migrations/0007_remove_location_institution.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.12 on 2022-08-15 12:39 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('location', '0006_alter_location_institution'), + ] + + operations = [ + migrations.RemoveField( + model_name='location', + name='institution', + ), + ] diff --git a/location/migrations/0008_location_institution.py b/location/migrations/0008_location_institution.py new file mode 100644 index 00000000..476eef32 --- /dev/null +++ b/location/migrations/0008_location_institution.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.12 on 2022-08-15 12:42 + +from django.db import migrations +import django.db.models.deletion +import modelcluster.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('institution', '0001_initial'), + ('location', '0007_remove_location_institution'), + ] + + operations = [ + migrations.AddField( + model_name='location', + name='institution', + field=modelcluster.fields.ParentalKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='locations', to='institution.institution'), + ), + ] diff --git a/location/migrations/0009_auto_20220815_1816.py b/location/migrations/0009_auto_20220815_1816.py new file mode 100644 index 00000000..899324aa --- /dev/null +++ b/location/migrations/0009_auto_20220815_1816.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.12 on 2022-08-15 18:16 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('location', '0008_location_institution'), + ] + + operations = [ + migrations.RemoveField( + model_name='location', + name='institution', + ), + migrations.RemoveField( + model_name='location', + name='name', + ), + migrations.RemoveField( + model_name='location', + name='sort_order', + ), + ] diff --git a/location/migrations/0010_alter_location_options.py b/location/migrations/0010_alter_location_options.py new file mode 100644 index 00000000..5af2b191 --- /dev/null +++ b/location/migrations/0010_alter_location_options.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.12 on 2022-08-15 18:24 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('location', '0009_auto_20220815_1816'), + ] + + operations = [ + migrations.AlterModelOptions( + name='location', + options={'verbose_name': 'Localização', 'verbose_name_plural': 'Locations'}, + ), + ] diff --git a/location/models.py b/location/models.py index 25c8553b..6799bd0e 100644 --- a/location/models.py +++ b/location/models.py @@ -1,15 +1,16 @@ from django.db import models -from core.models import CommonControlField from django.utils.translation import gettext as _ +from modelcluster.fields import ParentalKey +from wagtail.core.models import Orderable -from usefulmodels.models import City, State, Country +from core.models import CommonControlField +from usefulmodels.models import City, Country, State from . import choices +from .forms import LocationForm class Location(CommonControlField): - name = models.CharField(_("Name"), max_length=255, null=True, blank=True) - region = models.CharField(_("Region"), choices=choices.regions, max_length=255, null=True, blank=True) city = models.ForeignKey(City, verbose_name=_("City"), on_delete=models.CASCADE, @@ -18,3 +19,35 @@ class Location(CommonControlField): null=True, blank=True) country = models.ForeignKey(Country, verbose_name=_("Country"), on_delete=models.CASCADE, null=True, blank=True) + + class Meta: + verbose_name = _("Location") + verbose_name_plural = _("Locations") + + def __unicode__(self): + return u'%s: %s | %s: %s | %s: %s | %s: %s' % (_('Country'), self.country, _('Region'), self.region, _('State'), self.state, _('City'), self.city, ) + + def __str__(self): + return u'%s: %s | %s: %s | %s: %s | %s: %s' % (_('Country'), self.country, _('Region'), self.region, _('State'), self.state, _('City'), self.city, ) + + @classmethod + def get_or_create(cls, location_country, location_region, location_state, + location_city, user): + + # check if exists the location + if cls.objects.filter(country__name=location_country, region=location_region, state__name=location_state, city__name=location_city).exists(): + return cls.objects.get( + country__name=location_country, region=location_region, state__name=location_state, city__name=location_city) + else: + location = location() + location.region = location_region + location.country = location_country + location.state = location_state + location.city = location_city + location.creator = user + location.save() + + return location + + + base_form_class = LocationForm diff --git a/location/wagtail_hooks.py b/location/wagtail_hooks.py index 071dcf78..ad6cac39 100644 --- a/location/wagtail_hooks.py +++ b/location/wagtail_hooks.py @@ -23,10 +23,10 @@ class LocationAdmin(ModelAdmin): menu_order = 300 add_to_settings_menu = False # or True to add your model to the Settings sub-menu exclude_from_explorer = False # or True to exclude pages of this type from Wagtail's explorer view - list_display = ('name', 'region', 'city', 'state', 'country', 'creator', + list_display = ('country', 'region', 'state', 'city', 'creator', 'updated', 'created', ) - search_fields = ('name', 'region', 'city', 'state', 'country', ) - list_export = ('name', 'region', 'city', 'state', 'country', ) + search_fields = ('country', 'region', 'state', 'city', ) + list_export = ('country', 'region', 'state', 'city', ) export_filename = 'locations' -modeladmin_register(LocationAdmin) \ No newline at end of file +modeladmin_register(LocationAdmin) diff --git a/policy_directory/chkcsvfmt.fmt b/policy_directory/chkcsvfmt.fmt index f058e2fb..1e13ccba 100644 --- a/policy_directory/chkcsvfmt.fmt +++ b/policy_directory/chkcsvfmt.fmt @@ -17,3 +17,53 @@ type=String [Date] data_required=False type=Date + + +[Institution Name] +data_required=False +type=String + +[Institution Country] +data_required=False +type=String + +[Institution Region] +data_required=False +type=String + +[Institution State] +data_required=False +type=String + +[Institution City] +data_required=False +type=String + +[Thematic Area Level0] +data_required=False +type=String + +[Thematic Area Level1] +data_required=False +type=String + +[Thematic Area Level2] +data_required=False +type=String + +[Keywords] +data_required=False +type=String + +[Classification] +data_required=False +type=String + +[Pratice] +data_required=False +type=String + +[Action] +data_required=False +type=String + diff --git a/policy_directory/choices.py b/policy_directory/choices.py new file mode 100644 index 00000000..04d693ae --- /dev/null +++ b/policy_directory/choices.py @@ -0,0 +1,11 @@ +from django.utils.translation import gettext as _ + +classification = ( + ('', ''), + ('promoção', _('promoção')), + ('posicionamento', _('posicionamento')), + ('mandato', _('mandato')), + ('geral', _('geral')), +) + + diff --git a/policy_directory/example_policy.csv b/policy_directory/example_policy.csv index 341c42a9..16c7ec05 100644 --- a/policy_directory/example_policy.csv +++ b/policy_directory/example_policy.csv @@ -1,2 +1,2 @@ -Title,Institution,Link,Description,Date -Politica de acesso aberto,Instituição X,http://www.ac.com.br,Diretório internacional de política de acesso aberto,27/07/2022 \ No newline at end of file +Title,Institution,Link,Description,Date,Institution Name,Institution Country,Institution Region,Institution State,Institution City,Thematic Area Level0,Thematic Area Level1,Thematic Area Level2,Keywords,Classification,Pratice,Action +Politica de acesso aberto,Instituição X,http://www.ac.com.br,Diretório internacional de política de acesso aberto,27/07/2022,UERJ,Brasil,Sudeste,São Paulo,São Paulo,Ciências da Vida,Ciências Biológicas,Ciência de Alimentos,Ciências|Alimentos,portal,preprints,educação \ No newline at end of file diff --git a/policy_directory/migrations/0002_auto_20220809_1204.py b/policy_directory/migrations/0002_auto_20220809_1204.py new file mode 100644 index 00000000..568f4c7d --- /dev/null +++ b/policy_directory/migrations/0002_auto_20220809_1204.py @@ -0,0 +1,95 @@ +# Generated by Django 3.2.12 on 2022-08-09 12:04 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('wagtaildocs', '0012_uploadeddocument'), + ('policy_directory', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='policydirectory', + options={'verbose_name_plural': 'Diretório de Política'}, + ), + migrations.AlterModelOptions( + name='policydirectoryfile', + options={'verbose_name_plural': 'Diretório de Política Upload'}, + ), + migrations.AlterField( + model_name='policydirectory', + name='created', + field=models.DateTimeField(auto_now_add=True, verbose_name='Data de criação'), + ), + migrations.AlterField( + model_name='policydirectory', + name='creator', + field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='policydirectory_creator', to=settings.AUTH_USER_MODEL, verbose_name='Criador'), + ), + migrations.AlterField( + model_name='policydirectory', + name='date', + field=models.DateField(blank=True, max_length=255, null=True, verbose_name='Data de início'), + ), + migrations.AlterField( + model_name='policydirectory', + name='description', + field=models.TextField(blank=True, max_length=255, null=True, verbose_name='Descrição'), + ), + migrations.AlterField( + model_name='policydirectory', + name='institution', + field=models.TextField(max_length=255, verbose_name='Instituição'), + ), + migrations.AlterField( + model_name='policydirectory', + name='updated', + field=models.DateTimeField(auto_now=True, verbose_name='Data da última atualização'), + ), + migrations.AlterField( + model_name='policydirectory', + name='updated_by', + field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='policydirectory_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Atualizador'), + ), + migrations.AlterField( + model_name='policydirectoryfile', + name='attachment', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtaildocs.document', verbose_name='Anexo'), + ), + migrations.AlterField( + model_name='policydirectoryfile', + name='created', + field=models.DateTimeField(auto_now_add=True, verbose_name='Data de criação'), + ), + migrations.AlterField( + model_name='policydirectoryfile', + name='creator', + field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='policydirectoryfile_creator', to=settings.AUTH_USER_MODEL, verbose_name='Criador'), + ), + migrations.AlterField( + model_name='policydirectoryfile', + name='is_valid', + field=models.BooleanField(blank=True, default=False, null=True, verbose_name='É válido'), + ), + migrations.AlterField( + model_name='policydirectoryfile', + name='line_count', + field=models.IntegerField(blank=True, default=0, null=True, verbose_name='Número de linhas'), + ), + migrations.AlterField( + model_name='policydirectoryfile', + name='updated', + field=models.DateTimeField(auto_now=True, verbose_name='Data da última atualização'), + ), + migrations.AlterField( + model_name='policydirectoryfile', + name='updated_by', + field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='policydirectoryfile_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Atualizador'), + ), + ] diff --git a/policy_directory/migrations/0003_auto_20220815_1854.py b/policy_directory/migrations/0003_auto_20220815_1854.py new file mode 100644 index 00000000..40d11bf6 --- /dev/null +++ b/policy_directory/migrations/0003_auto_20220815_1854.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.12 on 2022-08-15 18:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('institution', '0003_institution_location'), + ('policy_directory', '0002_auto_20220809_1204'), + ] + + operations = [ + migrations.RemoveField( + model_name='policydirectory', + name='institution', + ), + migrations.AddField( + model_name='policydirectory', + name='institutions', + field=models.ManyToManyField(blank=True, to='institution.Institution'), + ), + ] diff --git a/policy_directory/migrations/0004_policydirectory_thematic_areas.py b/policy_directory/migrations/0004_policydirectory_thematic_areas.py new file mode 100644 index 00000000..03ec3924 --- /dev/null +++ b/policy_directory/migrations/0004_policydirectory_thematic_areas.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2022-08-17 15:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('usefulmodels', '0008_alter_thematicarea_options'), + ('policy_directory', '0003_auto_20220815_1854'), + ] + + operations = [ + migrations.AddField( + model_name='policydirectory', + name='thematic_areas', + field=models.ManyToManyField(blank=True, to='usefulmodels.ThematicArea'), + ), + ] diff --git a/policy_directory/migrations/0005_policydirectory_keywords.py b/policy_directory/migrations/0005_policydirectory_keywords.py new file mode 100644 index 00000000..3915e37f --- /dev/null +++ b/policy_directory/migrations/0005_policydirectory_keywords.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.12 on 2022-08-17 15:42 + +from django.db import migrations +import taggit.managers + + +class Migration(migrations.Migration): + + dependencies = [ + ('taggit', '0004_alter_taggeditem_content_type_alter_taggeditem_tag'), + ('policy_directory', '0004_policydirectory_thematic_areas'), + ] + + operations = [ + migrations.AddField( + model_name='policydirectory', + name='keywords', + field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'), + ), + ] diff --git a/policy_directory/migrations/0006_auto_20220817_1810.py b/policy_directory/migrations/0006_auto_20220817_1810.py new file mode 100644 index 00000000..b7723aa0 --- /dev/null +++ b/policy_directory/migrations/0006_auto_20220817_1810.py @@ -0,0 +1,30 @@ +# Generated by Django 3.2.12 on 2022-08-17 18:10 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('usefulmodels', '0011_action_pratice'), + ('policy_directory', '0005_policydirectory_keywords'), + ] + + operations = [ + migrations.AddField( + model_name='policydirectory', + name='action', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='usefulmodels.action'), + ), + migrations.AddField( + model_name='policydirectory', + name='classification', + field=models.CharField(blank=True, choices=[('', ''), ('promoção', 'promoção'), ('posicionamento', 'posicionamento'), ('mandato', 'mandato'), ('geral', 'geral')], max_length=255, null=True, verbose_name='Classification'), + ), + migrations.AddField( + model_name='policydirectory', + name='pratice', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='usefulmodels.pratice'), + ), + ] diff --git a/policy_directory/migrations/0007_alter_policydirectory_keywords.py b/policy_directory/migrations/0007_alter_policydirectory_keywords.py new file mode 100644 index 00000000..dbcf61ad --- /dev/null +++ b/policy_directory/migrations/0007_alter_policydirectory_keywords.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.12 on 2022-08-21 20:41 + +from django.db import migrations +import taggit.managers + + +class Migration(migrations.Migration): + + dependencies = [ + ('taggit', '0004_alter_taggeditem_content_type_alter_taggeditem_tag'), + ('policy_directory', '0006_auto_20220817_1810'), + ] + + operations = [ + migrations.AlterField( + model_name='policydirectory', + name='keywords', + field=taggit.managers.TaggableManager(blank=True, help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Keywords'), + ), + ] diff --git a/policy_directory/models.py b/policy_directory/models.py index 808d531f..1e1c1765 100644 --- a/policy_directory/models.py +++ b/policy_directory/models.py @@ -1,34 +1,53 @@ import os + from django.db import models from django.utils.translation import gettext as _ - -from wagtail.admin.edit_handlers import FieldPanel +from taggit.managers import TaggableManager +from wagtail.admin.edit_handlers import FieldPanel, HelpPanel from wagtail.documents.edit_handlers import DocumentChooserPanel from core.models import CommonControlField -from .forms import PolicyDirectoryForm, PolicyDirectoryFileForm +from institution.models import Institution +from usefulmodels.models import ThematicArea, Pratice, Action +from .forms import PolicyDirectoryFileForm, PolicyDirectoryForm +from . import choices class PolicyDirectory(CommonControlField): class Meta: verbose_name_plural = _('Policy Directory') title = models.CharField(_("Title"), max_length=255, null=False, blank=False) link = models.URLField(_("Link"), null=False, blank=False) - institution = models.TextField(_("Institution"), max_length=255, - null=False, blank=False) description = models.TextField(_("Description"), max_length=255, null=True, blank=True) date = models.DateField(_("Start Date"), max_length=255, null=True, blank=True) + institutions = models.ManyToManyField(Institution, verbose_name=_("Institution"), blank=True) + thematic_areas = models.ManyToManyField(ThematicArea, verbose_name=_("Thematic Area"), blank=True) + + pratice = models.ForeignKey(Pratice, verbose_name=_("Pratice"), + null=True, blank=True, on_delete=models.SET_NULL) + action = models.ForeignKey(Action, verbose_name=_("Action"), null=True, blank=True, on_delete=models.SET_NULL) + + classification = models.CharField(_("Classification"), choices=choices.classification, + max_length=255, null=True, blank=True) + + keywords = TaggableManager(_("Keywords"), blank=True) + panels = [ + HelpPanel('Documentos de promoção, posicionamentos ou mandatos sobre Ciência Aberta elaborados e publicados por instituições brasileiras, tais como: universidades, sociedades científicas, institutos de pesquisa e agências de fomento.'), FieldPanel('title'), - FieldPanel('institution'), FieldPanel('link'), FieldPanel('description'), FieldPanel('date'), - + FieldPanel('institutions'), + FieldPanel('thematic_areas'), + FieldPanel('keywords'), + FieldPanel('classification'), + FieldPanel('pratice'), + FieldPanel('action'), ] base_form_class = PolicyDirectoryForm diff --git a/policy_directory/views.py b/policy_directory/views.py index 78d69b39..36ade351 100644 --- a/policy_directory/views.py +++ b/policy_directory/views.py @@ -11,6 +11,9 @@ from .models import PolicyDirectoryFile, PolicyDirectory +from institution.models import Institution +from usefulmodels.models import Action, Pratice, ThematicArea + def validate(request): """ @@ -71,7 +74,7 @@ def import_file(request): with open(file_path, 'r') as csvfile: data = csv.DictReader(csvfile) - for row in data: + for line, row in enumerate(data): po = PolicyDirectory() po.title = row['Title'] po.link = row['Link'] @@ -80,6 +83,55 @@ def import_file(request): po.date = datetime.strptime(row['Date'], '%d/%m/%Y') po.creator = request.user po.save() + + # Institution + inst_name = row['Institution Name'] + if inst_name: + inst_country = row['Institution Country'] + inst_region = row['Institution Region'] + inst_state = row['Institution State'] + inst_city = row['Institution City'] + + institution = Institution.get_or_create(inst_name, inst_country, inst_region, + inst_state, inst_city, request.user) + po.institutions.add(institution) + + # Thematic Area + level0 = row['Thematic Area Level0'] + if level0: + level1 = row['Thematic Area Level1'] + level2 = row['Thematic Area Level2'] + the_area = ThematicArea.get_or_create(level0, level1, level2, request.user) + + po.thematic_areas.add(the_area) + + # Keywords + if row['Keywords']: + for key in row['Keywords'].split('|'): + po.keywords.add(key) + + if row['Classification']: + po.classification = row['Classification'] + + # Pratice + if row['Pratice']: + pratice_name = row['Pratice'] + if Pratice.objects.filter(name=pratice_name).exists(): + pratice = Pratice.objects.get(name=pratice_name) + po.pratice = pratice + else: + messages.error(request, _("Unknown pratice, line: %s") % str(line + 1)) + + # Action + if row['Action']: + action_name = row['Action'] + if Action.objects.filter(name=action_name).exists(): + action = Action.objects.get(name=action_name) + po.action = action + else: + messages.error(request, _("Unknown action, line: %s") % str(line + 1)) + + po.save() except Exception as ex: messages.error(request, _("Import error: %s") % ex) else: diff --git a/requirements/base.txt b/requirements/base.txt index d7fb7ab2..516151b7 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -41,4 +41,8 @@ wagtail-localize==1.2.1 # Django Tweaks # ------------------------------------------------------------------------------ -django-widget-tweaks==1.4.8 \ No newline at end of file +django-widget-tweaks==1.4.8 + +# Django celery results +# ------------------------------------------------------------------------------ +django_celery_results==2.4.0 \ No newline at end of file diff --git a/usefulmodels/choices.py b/usefulmodels/choices.py new file mode 100644 index 00000000..0cdd4250 --- /dev/null +++ b/usefulmodels/choices.py @@ -0,0 +1,69 @@ +from django.utils.translation import gettext as _ + +thematic_level0 = ( + ('', ''), + ('Ciências da Vida', _('Ciências da Vida')), + ('Ciências Físicas, Tecnológicas e Multidisciplinares', _('Ciências Físicas, Tecnológicas e Multidisciplinares')), + ('humanidades', _('Humanidades')), +) + +thematic_level1 = ( + ('', ''), + ('Ciências Agrárias', _('Ciências Agrárias')), + ('Ciências Biológicas', _('Ciências Biológicas')), + ('Ciências da Saúde', _('Ciências da Saúde')), + ('Ciências Exatas e da Terra', _('Ciências Exatas e da Terra')), + ('Ciências Humanas', _('Ciências Humanas')), + ('Ciências Sociais Aplicadas', _('Ciências Sociais Aplicadas')), + ('Engenharias', _('Engenharias')), + ('Lingüística, Letras e Artes', _('Lingüística, Letras e Artes')), +) + +thematic_level2 = ( + ('', ''), + ('Ciência de Alimentos', _('Ciência de Alimentos')), + ('Ciências Agrárias I', _('Ciências Agrárias I')), + ('Medicina Veterinária', _('Medicina Veterinária')), + ('Zootecnia/Recursos Pesqueiros', _('Zootecnia/Recursos Pesqueiros')), + ('Biodiversidade', _('Biodiversidade')), + ('Ciências Biológicas I', _('Ciências Biológicas I')), + ('Ciências Biológicas II', _('Ciências Biológicas II')), + ('Ciências Biológicas III', _('Ciências Biológicas III')), + ('Educação Física', _('Educação Física')), + ('Enfermagem', _('Enfermagem')), + ('Farmácia', _('Farmácia')), + ('Medicina I', _('Medicina I')), + ('Medicina II', _('Medicina II')), + ('Medicina III', _('Medicina III')), + ('Nutrição', _('Nutrição')), + ('Odontologia', _('Odontologia')), + ('Saúde Coletiva', _('Saúde Coletiva')), + ('Astronomia/Física', _('Astronomia/Física')), + ('Ciências da Computação', _('Ciências da Computação')), + ('Geociências', _('Geociências')), + ('Matemática/Probabilidade Estatística', _('Matemática/Probabilidade Estatística')), + ('Química', _('Química')), + ('Antropologia/Arqueologia', _('Antropologia/Arqueologia')), + ('Ciência Política e Relações Internacionais', _('Ciência Política e Relações Internacionais')), + ('Ciências da Religião e Teologia', _('Ciências da Religião e Teologia')), + ('Educação', _('Educação')), + ('Filosofia', _('Filosofia')), + ('Geografia', _('Geografia')), + ('História', _('História')), + ('Psicologia', _('Psicologia')), + ('Sociologia', _('Sociologia')), + ('Turismo', _('Turismo')), + ('Arquitetura, Urbanismo e Design', _('Arquitetura, Urbanismo e Design')), + ('Comunicação e Informação', _('Comunicação e Informação')), + ('Direito', _('Direito')), + ('Economia', _('Economia')), + ('Planejamento Urbano e Regional/Demografia', _('Planejamento Urbano e Regional/Demografia')), + ('Serviço Social', _('Serviço Social')), + ('Engenharias', _('Engenharias')), + ('Engenharias I', _('Engenharias I')), + ('Engenharias II', _('Engenharias II')), + ('Engenharias III', _('Engenharias III')), + ('Engenharias IV', _('Engenharias IV')), + ('Artes', _('Artes')), + ('Linguística e Literatura', _('Linguística e Literatura')), +) diff --git a/usefulmodels/forms.py b/usefulmodels/forms.py index df7985f2..baa057b4 100644 --- a/usefulmodels/forms.py +++ b/usefulmodels/forms.py @@ -44,3 +44,45 @@ def save_all(self, user): self.save() return country + +class ThematicAreaForm(WagtailAdminModelForm): + + def save_all(self, user): + thematic = super().save(commit=False) + + if self.instance.pk is not None: + thematic.updated_by = user + else: + thematic.creator = user + + self.save() + + return thematic + +class PraticeForm(WagtailAdminModelForm): + + def save_all(self, user): + pratice = super().save(commit=False) + + if self.instance.pk is not None: + pratice.updated_by = user + else: + pratice.creator = user + + self.save() + + return pratice + +class ActionForm(WagtailAdminModelForm): + + def save_all(self, user): + action = super().save(commit=False) + + if self.instance.pk is not None: + action.updated_by = user + else: + action.creator = user + + self.save() + + return action diff --git a/usefulmodels/migrations/0004_auto_20220815_1203.py b/usefulmodels/migrations/0004_auto_20220815_1203.py new file mode 100644 index 00000000..e4fab8ef --- /dev/null +++ b/usefulmodels/migrations/0004_auto_20220815_1203.py @@ -0,0 +1,50 @@ +# Generated by Django 3.2.12 on 2022-08-15 12:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('usefulmodels', '0003_auto_20220809_1204'), + ] + + operations = [ + migrations.AlterModelOptions( + name='city', + options={'verbose_name': 'Cidade', 'verbose_name_plural': 'Cidades'}, + ), + migrations.AlterModelOptions( + name='country', + options={'verbose_name': 'País', 'verbose_name_plural': 'Países'}, + ), + migrations.AlterModelOptions( + name='state', + options={'verbose_name': 'Estado', 'verbose_name_plural': 'Estados'}, + ), + migrations.AlterField( + model_name='city', + name='name', + field=models.CharField(blank=True, max_length=255, verbose_name='Nome da cidade'), + ), + migrations.AlterField( + model_name='country', + name='acronym', + field=models.CharField(blank=True, max_length=255, verbose_name='Acrônimo do país'), + ), + migrations.AlterField( + model_name='country', + name='name', + field=models.CharField(blank=True, max_length=255, verbose_name='Nome do País'), + ), + migrations.AlterField( + model_name='state', + name='acronym', + field=models.CharField(blank=True, max_length=255, verbose_name='Acrônimo do estado'), + ), + migrations.AlterField( + model_name='state', + name='name', + field=models.CharField(blank=True, max_length=255, verbose_name='Nome do estado'), + ), + ] diff --git a/usefulmodels/migrations/0005_auto_20220815_1232.py b/usefulmodels/migrations/0005_auto_20220815_1232.py new file mode 100644 index 00000000..6728d909 --- /dev/null +++ b/usefulmodels/migrations/0005_auto_20220815_1232.py @@ -0,0 +1,38 @@ +# Generated by Django 3.2.12 on 2022-08-15 12:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('usefulmodels', '0004_auto_20220815_1203'), + ] + + operations = [ + migrations.AlterField( + model_name='city', + name='name', + field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Nome da cidade'), + ), + migrations.AlterField( + model_name='country', + name='acronym', + field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Acrônimo do país'), + ), + migrations.AlterField( + model_name='country', + name='name', + field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Nome do País'), + ), + migrations.AlterField( + model_name='state', + name='acronym', + field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Acrônimo do estado'), + ), + migrations.AlterField( + model_name='state', + name='name', + field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Nome do estado'), + ), + ] diff --git a/usefulmodels/migrations/0006_thematicarea.py b/usefulmodels/migrations/0006_thematicarea.py new file mode 100644 index 00000000..640a8a07 --- /dev/null +++ b/usefulmodels/migrations/0006_thematicarea.py @@ -0,0 +1,32 @@ +# Generated by Django 3.2.12 on 2022-08-17 13:36 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('usefulmodels', '0005_auto_20220815_1232'), + ] + + operations = [ + migrations.CreateModel( + name='ThematicArea', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True, verbose_name='Data de criação')), + ('updated', models.DateTimeField(auto_now=True, verbose_name='Data da última atualização')), + ('level0', models.CharField(blank=True, choices=[('', ''), ('Ciências da Vida', 'Ciências da Vida'), ('Ciências Físicas, Tecnológicas e Multidisciplinares', 'Ciências Físicas, Tecnológicas e Multidisciplinares'), ('humanidades', 'Humanidades')], help_text='Here the thematic colleges of CAPES must be registered, more about these areas access: https://www.gov.br/capes/pt-br/acesso-a-informacao/acoes-e-programas/avaliacao/sobre-a-avaliacao/areas-avaliacao/sobre-as-areas-de-avaliacao/sobre-as-areas-de-avaliacao', max_length=255, null=True, verbose_name='Level 0')), + ('level1', models.CharField(blank=True, choices=[('', ''), ('Ciências Agrárias', 'Ciências Agrárias'), ('Ciências Biológicas', 'Ciências Biológicas'), ('Ciências da Saúde', 'Ciências da Saúde'), ('Ciências Exatas e da Terra', 'Ciências Exatas e da Terra'), ('Ciências Humanas', 'Ciências Humanas'), ('Ciências Sociais Aplicadas', 'Ciências Sociais Aplicadas'), ('Engenharias', 'Engenharias'), ('Lingüística, Letras e Artes', 'Lingüística, Letras e Artes')], help_text='Here the thematic colleges of CAPES must be registered, more about these areas access: https://www.gov.br/capes/pt-br/acesso-a-informacao/acoes-e-programas/avaliacao/sobre-a-avaliacao/areas-avaliacao/sobre-as-areas-de-avaliacao', max_length=255, null=True, verbose_name='Level 1')), + ('level2', models.CharField(blank=True, choices=[('', ''), ('Ciências Agrárias', 'Ciências Agrárias'), ('Ciências Biológicas', 'Ciências Biológicas'), ('Ciências da Saúde', 'Ciências da Saúde'), ('Ciências Exatas e da Terra', 'Ciências Exatas e da Terra'), ('Ciências Humanas', 'Ciências Humanas'), ('Ciências Sociais Aplicadas', 'Ciências Sociais Aplicadas'), ('Engenharias', 'Engenharias'), ('Lingüística, Letras e Artes', 'Lingüística, Letras e Artes')], help_text='Here the thematic colleges of CAPES must be registered, more about these areas access: https://www.gov.br/capes/pt-br/acesso-a-informacao/acoes-e-programas/avaliacao/sobre-a-avaliacao/areas-avaliacao/sobre-as-areas-de-avaliacao', max_length=255, null=True, verbose_name='Level 2')), + ('creator', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='thematicarea_creator', to=settings.AUTH_USER_MODEL, verbose_name='Criador')), + ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='thematicarea_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Atualizador')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/usefulmodels/migrations/0007_alter_thematicarea_level2.py b/usefulmodels/migrations/0007_alter_thematicarea_level2.py new file mode 100644 index 00000000..262dd960 --- /dev/null +++ b/usefulmodels/migrations/0007_alter_thematicarea_level2.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2022-08-17 13:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('usefulmodels', '0006_thematicarea'), + ] + + operations = [ + migrations.AlterField( + model_name='thematicarea', + name='level2', + field=models.CharField(blank=True, choices=[('', ''), ('Ciência de Alimentos', 'Ciência de Alimentos'), ('Ciências Agrárias I', 'Ciências Agrárias I'), ('Medicina Veterinária', 'Medicina Veterinária'), ('Zootecnia/Recursos Pesqueiros', 'Zootecnia/Recursos Pesqueiros'), ('Biodiversidade', 'Biodiversidade'), ('Ciências Biológicas I', 'Ciências Biológicas I'), ('Ciências Biológicas II', 'Ciências Biológicas II'), ('Ciências Biológicas III', 'Ciências Biológicas III'), ('Educação Física', 'Educação Física'), ('Enfermagem', 'Enfermagem'), ('Farmácia', 'Farmácia'), ('Medicina I', 'Medicina I'), ('Medicina II', 'Medicina II'), ('Medicina III', 'Medicina III'), ('Nutrição', 'Nutrição'), ('Odontologia', 'Odontologia'), ('Saúde Coletiva', 'Saúde Coletiva'), ('Astronomia/Física', 'Astronomia/Física'), ('Ciências da Computação', 'Ciências da Computação'), ('Geociências', 'Geociências'), ('Matemática/Probabilidade Estatística', 'Matemática/Probabilidade Estatística'), ('Química', 'Química'), ('Antropologia/Arqueologia', 'Antropologia/Arqueologia'), ('Ciência Política e Relações Internacionais', 'Ciência Política e Relações Internacionais'), ('Ciências da Religião e Teologia', 'Ciências da Religião e Teologia'), ('Educação', 'Educação'), ('Filosofia', 'Filosofia'), ('Geografia', 'Geografia'), ('História', 'História'), ('Psicologia', 'Psicologia'), ('Sociologia', 'Sociologia'), ('Administração Pública e de Empresas, Ciências Contábeis e', 'Administração Pública e de Empresas, Ciências Contábeis e'), ('Turismo', 'Turismo'), ('Arquitetura, Urbanismo e Design', 'Arquitetura, Urbanismo e Design'), ('Comunicação e Informação', 'Comunicação e Informação'), ('Direito', 'Direito'), ('Economia', 'Economia'), ('Planejamento Urbano e Regional/Demografia', 'Planejamento Urbano e Regional/Demografia'), ('Serviço Social', 'Serviço Social'), ('Engenharias', 'Engenharias'), ('Engenharias I', 'Engenharias I'), ('Engenharias II', 'Engenharias II'), ('Engenharias III', 'Engenharias III'), ('Engenharias IV', 'Engenharias IV'), ('Artes', 'Artes'), ('Linguística e Literatura', 'Linguística e Literatura')], help_text='Here the thematic colleges of CAPES must be registered, more about these areas access: https://www.gov.br/capes/pt-br/acesso-a-informacao/acoes-e-programas/avaliacao/sobre-a-avaliacao/areas-avaliacao/sobre-as-areas-de-avaliacao', max_length=255, null=True, verbose_name='Level 2'), + ), + ] diff --git a/usefulmodels/migrations/0008_alter_thematicarea_options.py b/usefulmodels/migrations/0008_alter_thematicarea_options.py new file mode 100644 index 00000000..e6de7465 --- /dev/null +++ b/usefulmodels/migrations/0008_alter_thematicarea_options.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.12 on 2022-08-17 13:49 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('usefulmodels', '0007_alter_thematicarea_level2'), + ] + + operations = [ + migrations.AlterModelOptions( + name='thematicarea', + options={'verbose_name': 'Thematic Area', 'verbose_name_plural': 'Thematic areas'}, + ), + ] diff --git a/usefulmodels/migrations/0009_auto_20220817_1501.py b/usefulmodels/migrations/0009_auto_20220817_1501.py new file mode 100644 index 00000000..1fa193c8 --- /dev/null +++ b/usefulmodels/migrations/0009_auto_20220817_1501.py @@ -0,0 +1,36 @@ +# Generated by Django 3.2.12 on 2022-08-17 15:01 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import taggit.managers + + +class Migration(migrations.Migration): + + dependencies = [ + ('taggit', '0004_alter_taggeditem_content_type_alter_taggeditem_tag'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('usefulmodels', '0008_alter_thematicarea_options'), + ] + + operations = [ + migrations.AlterModelOptions( + name='thematicarea', + options={'verbose_name': 'Thematic Area', 'verbose_name_plural': 'Thematic Areas'}, + ), + migrations.CreateModel( + name='Keyword', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True, verbose_name='Data de criação')), + ('updated', models.DateTimeField(auto_now=True, verbose_name='Data da última atualização')), + ('creator', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='keyword_creator', to=settings.AUTH_USER_MODEL, verbose_name='Criador')), + ('keys', taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags')), + ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='keyword_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Atualizador')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/usefulmodels/migrations/0010_delete_keyword.py b/usefulmodels/migrations/0010_delete_keyword.py new file mode 100644 index 00000000..dee68460 --- /dev/null +++ b/usefulmodels/migrations/0010_delete_keyword.py @@ -0,0 +1,16 @@ +# Generated by Django 3.2.12 on 2022-08-17 15:07 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('usefulmodels', '0009_auto_20220817_1501'), + ] + + operations = [ + migrations.DeleteModel( + name='Keyword', + ), + ] diff --git a/usefulmodels/migrations/0011_action_pratice.py b/usefulmodels/migrations/0011_action_pratice.py new file mode 100644 index 00000000..65e0d6b5 --- /dev/null +++ b/usefulmodels/migrations/0011_action_pratice.py @@ -0,0 +1,46 @@ +# Generated by Django 3.2.12 on 2022-08-17 17:43 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('usefulmodels', '0010_delete_keyword'), + ] + + operations = [ + migrations.CreateModel( + name='Pratice', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True, verbose_name='Data de criação')), + ('updated', models.DateTimeField(auto_now=True, verbose_name='Data da última atualização')), + ('name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Name of the pratice')), + ('code', models.CharField(blank=True, max_length=4, null=True, verbose_name='Code of the pratice')), + ('creator', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='pratice_creator', to=settings.AUTH_USER_MODEL, verbose_name='Criador')), + ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pratice_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Atualizador')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Action', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True, verbose_name='Data de criação')), + ('updated', models.DateTimeField(auto_now=True, verbose_name='Data da última atualização')), + ('name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Name of the action')), + ('code', models.CharField(blank=True, max_length=4, null=True, verbose_name='Code of the action')), + ('creator', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='action_creator', to=settings.AUTH_USER_MODEL, verbose_name='Criador')), + ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='action_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Atualizador')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/usefulmodels/migrations/0012_auto_20220819_1331.py b/usefulmodels/migrations/0012_auto_20220819_1331.py new file mode 100644 index 00000000..f074fd56 --- /dev/null +++ b/usefulmodels/migrations/0012_auto_20220819_1331.py @@ -0,0 +1,26 @@ +# Generated by Django 3.2.12 on 2022-08-19 13:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('usefulmodels', '0011_action_pratice'), + ] + + operations = [ + migrations.AlterModelOptions( + name='action', + options={'verbose_name': 'Ação', 'verbose_name_plural': 'Ações'}, + ), + migrations.AlterModelOptions( + name='pratice', + options={'verbose_name': 'Pratice', 'verbose_name_plural': 'Pratices'}, + ), + migrations.AlterField( + model_name='thematicarea', + name='level2', + field=models.CharField(blank=True, choices=[('', ''), ('Ciência de Alimentos', 'Ciência de Alimentos'), ('Ciências Agrárias I', 'Ciências Agrárias I'), ('Medicina Veterinária', 'Medicina Veterinária'), ('Zootecnia/Recursos Pesqueiros', 'Zootecnia/Recursos Pesqueiros'), ('Biodiversidade', 'Biodiversidade'), ('Ciências Biológicas I', 'Ciências Biológicas I'), ('Ciências Biológicas II', 'Ciências Biológicas II'), ('Ciências Biológicas III', 'Ciências Biológicas III'), ('Educação Física', 'Educação Física'), ('Enfermagem', 'Enfermagem'), ('Farmácia', 'Farmácia'), ('Medicina I', 'Medicina I'), ('Medicina II', 'Medicina II'), ('Medicina III', 'Medicina III'), ('Nutrição', 'Nutrição'), ('Odontologia', 'Odontologia'), ('Saúde Coletiva', 'Saúde Coletiva'), ('Astronomia/Física', 'Astronomia/Física'), ('Ciências da Computação', 'Ciências da Computação'), ('Geociências', 'Geociências'), ('Matemática/Probabilidade Estatística', 'Matemática/Probabilidade Estatística'), ('Química', 'Química'), ('Antropologia/Arqueologia', 'Antropologia/Arqueologia'), ('Ciência Política e Relações Internacionais', 'Ciência Política e Relações Internacionais'), ('Ciências da Religião e Teologia', 'Ciências da Religião e Teologia'), ('Educação', 'Educação'), ('Filosofia', 'Filosofia'), ('Geografia', 'Geografia'), ('História', 'História'), ('Psicologia', 'Psicologia'), ('Sociologia', 'Sociologia'), ('Turismo', 'Turismo'), ('Arquitetura, Urbanismo e Design', 'Arquitetura, Urbanismo e Design'), ('Comunicação e Informação', 'Comunicação e Informação'), ('Direito', 'Direito'), ('Economia', 'Economia'), ('Planejamento Urbano e Regional/Demografia', 'Planejamento Urbano e Regional/Demografia'), ('Serviço Social', 'Serviço Social'), ('Engenharias', 'Engenharias'), ('Engenharias I', 'Engenharias I'), ('Engenharias II', 'Engenharias II'), ('Engenharias III', 'Engenharias III'), ('Engenharias IV', 'Engenharias IV'), ('Artes', 'Artes'), ('Linguística e Literatura', 'Linguística e Literatura')], help_text='Here the thematic colleges of CAPES must be registered, more about these areas access: https://www.gov.br/capes/pt-br/acesso-a-informacao/acoes-e-programas/avaliacao/sobre-a-avaliacao/areas-avaliacao/sobre-as-areas-de-avaliacao', max_length=255, null=True, verbose_name='Level 2'), + ), + ] diff --git a/usefulmodels/models.py b/usefulmodels/models.py index ca71d21f..4d322d75 100644 --- a/usefulmodels/models.py +++ b/usefulmodels/models.py @@ -1,8 +1,10 @@ from django.db import models from django.utils.translation import gettext as _ from core.models import CommonControlField -from usefulmodels.forms import CityForm, CountryForm, StateForm +from usefulmodels.forms import (CityForm, CountryForm, StateForm, ThematicAreaForm, + PraticeForm, ActionForm) +from . import choices class City(CommonControlField): """ @@ -12,7 +14,7 @@ class City(CommonControlField): name """ - name = models.CharField(_("Name of the city"), blank=True, max_length=255) + name = models.CharField(_("Name of the city"), blank=True, null=True, max_length=255) class Meta: verbose_name = _("City") @@ -36,8 +38,8 @@ class State(CommonControlField): acronym """ - name = models.CharField(_("Name of the state"), blank=True, max_length=255) - acronym = models.CharField(_("Acronym to the state"), blank=True, max_length=255) + name = models.CharField(_("Name of the state"), blank=True, null=True, max_length=255) + acronym = models.CharField(_("Acronym to the state"), blank=True, null=True, max_length=255) class Meta: verbose_name = _("State") @@ -51,6 +53,7 @@ def __str__(self): base_form_class = StateForm + class Country(CommonControlField): """ Represent the list of Countries @@ -60,8 +63,8 @@ class Country(CommonControlField): acronym """ - name = models.CharField(_("Name of the Country"), blank=True, max_length=255) - acronym = models.CharField(_("Acronym to the Country"), blank=True, max_length=255) + name = models.CharField(_("Name of the Country"), blank=True, null=True, max_length=255) + acronym = models.CharField(_("Acronym to the Country"), blank=True, null=True, max_length=255) class Meta: verbose_name = _("Country") @@ -75,3 +78,99 @@ def __str__(self): base_form_class = CountryForm + +class ThematicArea(CommonControlField): + """ + Represent the thematic areas wit 3 levels. + + Fields: + level 0 + level 1 + level 2 + """ + + level0 = models.CharField(_("Level 0"), choices=choices.thematic_level0, + max_length=255, null=True, blank=True, help_text="Here the thematic colleges of CAPES must be registered, more about these areas access: https://www.gov.br/capes/pt-br/acesso-a-informacao/acoes-e-programas/avaliacao/sobre-a-avaliacao/areas-avaliacao/sobre-as-areas-de-avaliacao/sobre-as-areas-de-avaliacao") + + level1 = models.CharField(_("Level 1"), choices=choices.thematic_level1, + max_length=255, null=True, blank=True, help_text="Here the thematic colleges of CAPES must be registered, more about these areas access: https://www.gov.br/capes/pt-br/acesso-a-informacao/acoes-e-programas/avaliacao/sobre-a-avaliacao/areas-avaliacao/sobre-as-areas-de-avaliacao") + + level2 = models.CharField(_("Level 2"), choices=choices.thematic_level2, + max_length=255, null=True, blank=True, help_text="Here the thematic colleges of CAPES must be registered, more about these areas access: https://www.gov.br/capes/pt-br/acesso-a-informacao/acoes-e-programas/avaliacao/sobre-a-avaliacao/areas-avaliacao/sobre-as-areas-de-avaliacao") + + class Meta: + verbose_name = _("Thematic Area") + verbose_name_plural = _("Thematic Areas") + + def __unicode__(self): + return u'%s | %s | %s' % (self.level0, self.level1, self.level2, ) + + def __str__(self): + return u'%s | %s | %s' % (self.level0, self.level1, self.level2, ) + + @classmethod + def get_or_create(cls, level0, level1, level2, user): + + if ThematicArea.objects.filter(level0=level0, level1=level1, level2=level2).exists(): + return ThematicArea.objects.get(level0=level0, level1=level1, level2=level2) + else: + the_area = ThematicArea() + the_area.level0 = level0 + the_area.level1 = level1 + the_area.level2 = level2 + the_area.creator = user + the_area.save() + + return the_area + + + base_form_class = ThematicAreaForm + + +class Pratice(CommonControlField): + """ + Represent Pratices + + Fields: + name + code + """ + name = models.CharField(_("Name of the pratice"), blank=True, null=True, max_length=255) + code = models.CharField(_("Code of the pratice"), blank=True, null=True, max_length=4) + + class Meta: + verbose_name = _("Pratice") + verbose_name_plural = _("Pratices") + + def __unicode__(self): + return u'%s - %s' % (self.code, self.name, ) + + def __str__(self): + return u'%s - %s' % (self.code, self.name, ) + + + base_form_class = PraticeForm + + +class Action(CommonControlField): + """ + Represent Action + + Fields: + name + code + """ + name = models.CharField(_("Name of the action"), blank=True, null=True, max_length=255) + code = models.CharField(_("Code of the action"), blank=True, null=True, max_length=4) + + class Meta: + verbose_name = _("Action") + verbose_name_plural = _("Actions") + + def __unicode__(self): + return u'%s - %s' % (self.code, self.name, ) + + def __str__(self): + return u'%s - %s' % (self.code, self.name, ) + + base_form_class = ActionForm diff --git a/usefulmodels/scripts/bulk_action.py b/usefulmodels/scripts/bulk_action.py new file mode 100644 index 00000000..afda428e --- /dev/null +++ b/usefulmodels/scripts/bulk_action.py @@ -0,0 +1,27 @@ +import os +from usefulmodels import models +from django.contrib.auth import get_user_model + +User = get_user_model() + +# This script add bulk of actions +# Consider that existe a user with id=1 + +ACTIONS = [ + ('10', 'política, recomendação etc.'), + ('20', 'desempenho'), + ('30', 'infraestrutura'), + ('40', 'educação'), + ('50', 'divulgação'), + ('90', 'outras'), +] + + +def run(): + + # User + creator = User.objects.get(id=1) + + for code, val in ACTIONS: + + models.Action(code=code, name=val, creator=creator).save() diff --git a/usefulmodels/scripts/bulk_pratice.py b/usefulmodels/scripts/bulk_pratice.py new file mode 100644 index 00000000..ced67411 --- /dev/null +++ b/usefulmodels/scripts/bulk_pratice.py @@ -0,0 +1,35 @@ +import os +from usefulmodels import models +from django.contrib.auth import get_user_model + +User = get_user_model() + +# This script add bulk of pratices +# Consider that existe a user with id=1 + +PRATICES = [ + ('100', 'menção genérica à CA ou todas as práticas'), + ('210', 'preprints'), + ('220', 'version of record indexados - periódicos, documentos, artigos'), + ('230', 'livros, capítulo de livros'), + ('240', 'teses, dissertações, TCC'), + ('250', 'projetos de pesquisa'), + ('260', 'declarações'), + ('270', 'outros docs'), + ('280', 'repositórios tipo verde – documentos em geral, ..'), + ('300', 'dados genéricos'), + ('310', 'códigos'), + ('400', 'peer review'), + ('500', 'ciência cidadã'), + ('600', 'recursos educacionais'), + ('900', 'outra'), +] + +def run(): + + # User + creator = User.objects.get(id=1) + + for code, val in PRATICES: + + models.Pratice(code=code, name=val, creator=creator).save() diff --git a/usefulmodels/wagtail_hooks.py b/usefulmodels/wagtail_hooks.py index 122630af..6a077df1 100644 --- a/usefulmodels/wagtail_hooks.py +++ b/usefulmodels/wagtail_hooks.py @@ -5,7 +5,7 @@ from wagtail.contrib.modeladmin.views import CreateView from wagtail.contrib.modeladmin.options import (ModelAdmin, modeladmin_register, ModelAdminGroup) -from .models import City, State, Country +from .models import City, State, Country, ThematicArea, Pratice, Action class CityCreateView(CreateView): @@ -28,6 +28,24 @@ def form_valid(self, form): self.object = form.save_all(self.request.user) return HttpResponseRedirect(self.get_success_url()) +class ThematicAreaCreateView(CreateView): + + def form_valid(self, form): + self.object = form.save_all(self.request.user) + return HttpResponseRedirect(self.get_success_url()) + +class PraticeCreateView(CreateView): + + def form_valid(self, form): + self.object = form.save_all(self.request.user) + return HttpResponseRedirect(self.get_success_url()) + +class ActionCreateView(CreateView): + + def form_valid(self, form): + self.object = form.save_all(self.request.user) + return HttpResponseRedirect(self.get_success_url()) + class CityAdmin(ModelAdmin): model = City @@ -74,11 +92,58 @@ class CountryAdmin(ModelAdmin): export_filename = 'countryies' +class ThematicAreaAdmin(ModelAdmin): + model = ThematicArea + create_view_class = ThematicAreaCreateView + menu_label = _('Thematic Area') + menu_icon = 'folder' + menu_order = 100 + add_to_settings_menu = False # or True to add your model to the Settings sub-menu + exclude_from_explorer = False # or True to exclude pages of this type from Wagtail's explorer view + list_display = ('level0', 'level1', 'level2', 'creator', + 'updated', 'created', ) + search_fields = ('level0', 'level1', 'level2', ) + list_export = ('level0', 'level1', 'level2', 'creator', + 'updated', 'created', ) + export_filename = 'thematic_areas' + +class PraticeAdmin(ModelAdmin): + model = Pratice + create_view_class = PraticeCreateView + menu_label = _('Pratice') + menu_icon = 'folder' + menu_order = 100 + add_to_settings_menu = False # or True to add your model to the Settings sub-menu + exclude_from_explorer = False # or True to exclude pages of this type from Wagtail's explorer view + list_display = ('name', 'code', 'creator', + 'updated', 'created', ) + search_fields = ('name', 'code',) + list_export = ('name', 'code', 'creator', + 'updated', 'created', ) + export_filename = 'pratices' + +class ActionAdmin(ModelAdmin): + model = Action + create_view_class = ActionCreateView + menu_label = _('Action') + menu_icon = 'folder' + menu_order = 100 + add_to_settings_menu = False # or True to add your model to the Settings sub-menu + exclude_from_explorer = False # or True to exclude pages of this type from Wagtail's explorer view + list_display = ('name', 'code', 'creator', + 'updated', 'created', ) + search_fields = ('name', 'code',) + list_export = ('name', 'code', 'creator', + 'updated', 'created', ) + export_filename = 'actions' + + class UsefulModelsAdminGroup(ModelAdminGroup): menu_label = _('Useful Models') menu_icon = 'folder-open-inverse' menu_order = 200 - items = (CityAdmin, StateAdmin, CountryAdmin) + items = (CityAdmin, StateAdmin, CountryAdmin, PraticeAdmin, ActionAdmin, + ThematicAreaAdmin) modeladmin_register(UsefulModelsAdminGroup)