diff --git a/coopstarter_data/migrations/0019_auto_20201130_1805.py b/coopstarter_data/migrations/0019_auto_20201130_1805.py new file mode 100644 index 0000000000000000000000000000000000000000..4997ee4f5ace4c73ac03737f83f14b282b89f2d4 --- /dev/null +++ b/coopstarter_data/migrations/0019_auto_20201130_1805.py @@ -0,0 +1,226 @@ +# Generated by Django 2.2 on 2020-11-30 18:05 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('coopstarter_data', '0019_auto_20201130_1234'), + ] + + operations = [ + migrations.AlterField( + model_name='brokenlink', + name='resource', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='brokenlink_resource', to='coopstarter_data.Resource'), + ), + migrations.AlterField( + model_name='brokenlink', + name='submitter', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='brokenlink_submitter', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='contributor', + name='country', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='contributors', to='coopstarter_data.Country'), + ), + migrations.AlterField( + model_name='contributor', + name='organisation', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='contributors', to='coopstarter_data.Organisation'), + ), + migrations.AlterField( + model_name='contributor', + name='user', + field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contributor_profile', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='country', + name='code', + field=models.CharField(blank=True, max_length=2, null=True, verbose_name='ISO Code'), + ), + migrations.AlterField( + model_name='country', + name='name', + field=models.CharField(blank=True, max_length=64, null=True, verbose_name='Country name'), + ), + migrations.AlterField( + model_name='field', + name='name', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Title'), + ), + migrations.AlterField( + model_name='format', + name='name', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Title'), + ), + migrations.AlterField( + model_name='interfacelanguage', + name='code', + field=models.CharField(blank=True, max_length=2, null=True, verbose_name='ISO Code'), + ), + migrations.AlterField( + model_name='interfacelanguage', + name='name', + field=models.CharField(blank=True, max_length=64, null=True, verbose_name='Language name'), + ), + migrations.AlterField( + model_name='language', + name='code', + field=models.CharField(blank=True, max_length=2, null=True, verbose_name='ISO Code'), + ), + migrations.AlterField( + model_name='language', + name='name', + field=models.CharField(blank=True, max_length=64, null=True, verbose_name='Language name'), + ), + migrations.AlterField( + model_name='learningoutcome', + name='name', + field=models.CharField(blank=True, max_length=256, null=True, verbose_name='Learning outcome'), + ), + migrations.AlterField( + model_name='organisation', + name='name', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Name'), + ), + migrations.AlterField( + model_name='organisation', + name='website', + field=models.CharField(blank=True, max_length=4096, null=True, verbose_name='Website'), + ), + migrations.AlterField( + model_name='request', + name='country', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='coopstarter_data.Country'), + ), + migrations.AlterField( + model_name='request', + name='created_on', + field=models.DateTimeField(default=django.utils.timezone.now, null=True), + ), + migrations.AlterField( + model_name='request', + name='description', + field=models.TextField(blank=True, null=True, verbose_name='Description'), + ), + migrations.AlterField( + model_name='request', + name='language', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='coopstarter_data.Language', verbose_name='Language'), + ), + migrations.AlterField( + model_name='request', + name='name', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Title'), + ), + migrations.AlterField( + model_name='request', + name='organisation', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='requests', to='coopstarter_data.Organisation'), + ), + migrations.AlterField( + model_name='request', + name='reviewer', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reviewed_requests', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='request', + name='skills', + field=models.TextField(blank=True, null=True, verbose_name='Learning outcomes/skills'), + ), + migrations.AlterField( + model_name='request', + name='submitter', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='requests', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='resource', + name='country', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='coopstarter_data.Country'), + ), + migrations.AlterField( + model_name='resource', + name='format', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='resources', to='coopstarter_data.Format'), + ), + migrations.AlterField( + model_name='resource', + name='name', + field=models.CharField(blank=True, max_length=256, null=True, verbose_name='Title'), + ), + migrations.AlterField( + model_name='resource', + name='resource_author', + field=models.CharField(blank=True, max_length=256, null=True, verbose_name='Author'), + ), + migrations.AlterField( + model_name='resource', + name='review', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='resource', to='coopstarter_data.Review', verbose_name='Associated review'), + ), + migrations.AlterField( + model_name='resource', + name='sharing', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='resources', to='coopstarter_data.SharingCriteria', verbose_name='Sharing profile'), + ), + migrations.AlterField( + model_name='resource', + name='submitter', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='resources', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='resource', + name='target', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='coopstarter_data.Target', verbose_name='Target audience'), + ), + migrations.AlterField( + model_name='resource', + name='uri', + field=models.CharField(blank=True, max_length=4086, null=True, verbose_name='Location/weblink'), + ), + migrations.AlterField( + model_name='review', + name='comment', + field=models.TextField(blank=True, null=True, verbose_name='Comment'), + ), + migrations.AlterField( + model_name='review', + name='reviewer', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reviews', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='searcher', + name='organisation', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='searchers', to='coopstarter_data.Organisation'), + ), + migrations.AlterField( + model_name='searcher', + name='user', + field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='searcher_profile', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='sharingcriteria', + name='name', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='name'), + ), + migrations.AlterField( + model_name='step', + name='name', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Name'), + ), + migrations.AlterField( + model_name='target', + name='name', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='name'), + ), + migrations.AlterField( + model_name='type', + name='name', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Title'), + ), + ] diff --git a/coopstarter_data/models.py b/coopstarter_data/models.py index 7c197ee52dce891455e0535648176a0664d00935..b867aa8d0acabfb8d02a19a9c6b6a660dfe0d972 100644 --- a/coopstarter_data/models.py +++ b/coopstarter_data/models.py @@ -12,7 +12,7 @@ from django.template import loader from djangoldp_i18n.views import I18nLDPViewSet class LearningOutcome (Model) : - name = models.CharField(max_length=256, verbose_name="Learning outcome") + name = models.CharField(max_length=256, verbose_name="Learning outcome", null=True, blank=True) class Meta: rdf_type = 'coopstarter:skills' @@ -23,8 +23,8 @@ class LearningOutcome (Model) : return self.name class InterfaceLanguage (Model): - code = models.CharField(max_length=2, verbose_name="ISO Code") - name = models.CharField(max_length=64, verbose_name="Language name") + code = models.CharField(max_length=2, verbose_name="ISO Code", null=True, blank=True) + name = models.CharField(max_length=64, verbose_name="Language name", null=True, blank=True) class Meta: rdf_type = 'coopstarter:interfacelanguage' @@ -33,8 +33,8 @@ class InterfaceLanguage (Model): return self.name class Country (Model): - code = models.CharField(max_length=2, verbose_name="ISO Code") - name = models.CharField(max_length=64, verbose_name="Country name") + code = models.CharField(max_length=2, verbose_name="ISO Code", null=True, blank=True) + name = models.CharField(max_length=64, verbose_name="Country name", null=True, blank=True) class Meta: rdf_type = 'coopstarter:country' @@ -43,8 +43,8 @@ class Country (Model): return self.name class Language (Model): - code = models.CharField(max_length=2, verbose_name="ISO Code") - name = models.CharField(max_length=64, verbose_name="Language name") + code = models.CharField(max_length=2, verbose_name="ISO Code", null=True, blank=True) + name = models.CharField(max_length=64, verbose_name="Language name", null=True, blank=True) class Meta: rdf_type = 'coopstarter:language' @@ -53,8 +53,8 @@ class Language (Model): return self.name class Organisation (Model): - name = models.CharField(max_length=128, verbose_name="Name") - website = models.CharField(max_length=4096, verbose_name="Website") + name = models.CharField(max_length=128, verbose_name="Name", null=True, blank=True) + website = models.CharField(max_length=4096, verbose_name="Website", null=True, blank=True) class Meta: rdf_type = 'coopstarter:organisation' @@ -63,7 +63,7 @@ class Organisation (Model): return self.name class Step (Model): - name = models.CharField(max_length=128, verbose_name="Name") + name = models.CharField(max_length=128, verbose_name="Name", null=True, blank=True) order = models.IntegerField(verbose_name="Order", blank=True, null=True, default=0) class Meta: @@ -79,7 +79,7 @@ class Step (Model): return self.name class Format (Model): - name = models.CharField(max_length=128, verbose_name="Title") + name = models.CharField(max_length=128, verbose_name="Title", blank=True, null=True) class Meta: rdf_type = 'coopstarter:format' @@ -90,7 +90,7 @@ class Format (Model): return self.name class Field (Model): - name = models.CharField(max_length=128, verbose_name="Title") + name = models.CharField(max_length=128, verbose_name="Title", null=True, blank=True) class Meta: rdf_type = 'coopstarter:field' @@ -101,7 +101,7 @@ class Field (Model): return self.name class Type (Model): - name = models.CharField(max_length=128, verbose_name="Title") + name = models.CharField(max_length=128, verbose_name="Title", null=True, blank=True) class Meta: rdf_type = 'coopstarter:resourcetype' @@ -112,7 +112,7 @@ class Type (Model): return self.name class Target (Model): - name = models.CharField(max_length=128, verbose_name="name") + name = models.CharField(max_length=128, verbose_name="name", blank=True, null=True) value = models.CharField(max_length=128, verbose_name="value", blank=True, null=True) class Meta: @@ -124,7 +124,7 @@ class Target (Model): return self.name class SharingCriteria (Model): - name = models.CharField(max_length=128, verbose_name="name") + name = models.CharField(max_length=128, verbose_name="name", blank=True, null=True) value = models.CharField(max_length=128, verbose_name="value", blank=True, null=True) class Meta: @@ -137,8 +137,9 @@ class SharingCriteria (Model): class Searcher(Model): - user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name="searcher_profile", on_delete=models.DO_NOTHING) - organisation = models.ForeignKey(Organisation, null=True, on_delete=models.DO_NOTHING, related_name="searchers") + user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name="searcher_profile", on_delete=models.CASCADE, + null=True) + organisation = models.ForeignKey(Organisation, null=True, on_delete=models.CASCADE, related_name="searchers") class Meta: auto_author = 'user' @@ -156,10 +157,11 @@ class Searcher(Model): return self.user.get_full_name() class Contributor(Model): - user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name="contributor_profile", on_delete=models.DO_NOTHING) + user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name="contributor_profile", on_delete=models.CASCADE, + null=True) phone = models.CharField(max_length=25, null=True, blank=True, verbose_name='Phone number') - organisation = models.ForeignKey(Organisation, null=True, on_delete=models.DO_NOTHING, related_name="contributors") - country = models.ForeignKey(Country, null=True, related_name="contributors", on_delete=models.DO_NOTHING) + organisation = models.ForeignKey(Organisation, null=True, on_delete=models.SET_NULL, related_name="contributors") + country = models.ForeignKey(Country, null=True, related_name="contributors", on_delete=models.SET_NULL) languages = models.ManyToManyField(Language, blank=True) headline = models.CharField(max_length=256, blank=True, null=True, verbose_name='Headline or current position') @@ -194,9 +196,9 @@ class Contributor(Model): return self.user.get_full_name() class Review (Model): - comment = models.TextField(verbose_name="Comment", blank=True) + comment = models.TextField(verbose_name="Comment", blank=True, null=True) status = models.CharField(max_length=32, choices=(('pending', 'Pending'), ('inappropriate', 'Inappropriate'), ('validated', 'Validated'), ('to_improve', 'Improvement required')), verbose_name="Resource status", blank=True, null=True) - reviewer = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.DO_NOTHING, related_name='reviews') + reviewer = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.SET_NULL, related_name='reviews') class Meta: owner_field = 'reviewer' @@ -214,15 +216,15 @@ class Review (Model): class Resource (Model): # Mandatory Fields - name = models.CharField(max_length=256, verbose_name="Title") + name = models.CharField(max_length=256, verbose_name="Title", blank=True, null=True) - format = models.ForeignKey(Format, null=True, related_name='resources', on_delete=models.DO_NOTHING) + format = models.ForeignKey(Format, null=True, related_name='resources', on_delete=models.SET_NULL) publication_year = models.IntegerField(verbose_name="Publication Year", null=True, blank=True) languages = models.ManyToManyField(Language, blank=True, verbose_name="Languages", related_name='resources') fields = models.ManyToManyField(Field, blank=True, verbose_name="Fields", related_name='resources') - country = models.ForeignKey(Country, null=True, on_delete=models.DO_NOTHING) - uri = models.CharField(max_length=4086, verbose_name="Location/weblink") - resource_author = models.CharField(max_length=256, verbose_name="Author") + country = models.ForeignKey(Country, null=True, on_delete=models.SET_NULL) + uri = models.CharField(max_length=4086, verbose_name="Location/weblink", blank=True, null=True) + resource_author = models.CharField(max_length=256, verbose_name="Author", blank=True, null=True) skills = models.ManyToManyField(LearningOutcome, blank=True, verbose_name="Learning outcomes/skills", related_name='resources') # Complementary fields @@ -231,13 +233,13 @@ class Resource (Model): preview_image = models.URLField(blank=True, null=True) # Classification Fields - target = models.ForeignKey(Target, verbose_name="Target audience", blank=True, null=True, on_delete=models.DO_NOTHING) + target = models.ForeignKey(Target, verbose_name="Target audience", blank=True, null=True, on_delete=models.SET_NULL) type = models.ManyToManyField(Type, blank=True, verbose_name="Type of content", related_name='resources') - sharing = models.ForeignKey(SharingCriteria, blank=True, null=True, verbose_name="Sharing profile", related_name='resources', on_delete=models.DO_NOTHING) + sharing = models.ForeignKey(SharingCriteria, blank=True, null=True, verbose_name="Sharing profile", related_name='resources', on_delete=models.SET_NULL) steps = models.ManyToManyField(Step, blank=True, related_name="resources") # Relations to other models - submitter = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.DO_NOTHING, related_name='resources') + submitter = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.SET_NULL, related_name='resources') related = models.ManyToManyField("self", blank=True) conversations = models.ManyToManyField(Conversation, blank=True, related_name='resources') likes = models.ManyToManyField(Like, blank=True, related_name='resources') @@ -267,21 +269,21 @@ class Resource (Model): class Request (Model): # Mandatory Fields - name = models.CharField(max_length=128, verbose_name="Title") - description = models.TextField(verbose_name="Description") + name = models.CharField(max_length=128, verbose_name="Title", null=True, blank=True) + description = models.TextField(verbose_name="Description", null=True, blank=True) status = models.CharField(max_length=32, verbose_name="Status", choices=(('pending', 'Pending'), ('validated', 'Validated')), default="pending") - language = models.ForeignKey(Language, blank=True, verbose_name="Language", on_delete=models.DO_NOTHING) + language = models.ForeignKey(Language, blank=True, verbose_name="Language", on_delete=models.SET_NULL, null=True) fields = models.ManyToManyField(Field, blank=True) - country = models.ForeignKey(Country, null=True, on_delete=models.DO_NOTHING) + country = models.ForeignKey(Country, null=True, on_delete=models.SET_NULL) - organisation = models.ForeignKey(Organisation, on_delete=models.DO_NOTHING, related_name="requests") - skills = models.TextField(verbose_name="Learning outcomes/skills") + organisation = models.ForeignKey(Organisation, on_delete=models.SET_NULL, related_name="requests", null=True) + skills = models.TextField(verbose_name="Learning outcomes/skills", null=True, blank=True) - submitter = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.DO_NOTHING, related_name='requests') - reviewer = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.DO_NOTHING, related_name='reviewed_requests') + submitter = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.SET_NULL, related_name='requests') + reviewer = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.SET_NULL, related_name='reviewed_requests') - created_on = models.DateTimeField(default=timezone.now) + created_on = models.DateTimeField(default=timezone.now, null=True) class Meta: ordering = ['-created_on'] @@ -301,8 +303,9 @@ class Request (Model): return self.name class BrokenLink(Model): - submitter = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING, related_name="brokenlink_submitter") - resource = models.ForeignKey(Resource, null=True, on_delete=models.DO_NOTHING, related_name="brokenlink_resource") + submitter = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, related_name="brokenlink_submitter", + null=True, blank=True) + resource = models.ForeignKey(Resource, null=True, on_delete=models.SET_NULL, related_name="brokenlink_resource") class Meta: auto_author = 'submitter' diff --git a/coopstarter_data/views.py b/coopstarter_data/views.py index 1ad012173fb6c185d2f54a6961061dc7089eae2d..db3bc1f099951d2bbae289366eebae139b13dfc4 100644 --- a/coopstarter_data/views.py +++ b/coopstarter_data/views.py @@ -17,7 +17,7 @@ class ValidatedResourcesByStepViewSet(I18nLDPViewSet): # Additional filter criteria: , target__value=target return super().get_queryset(*args, **kwargs)\ .filter(steps__in=step_id, review__status='validated')\ - .exclude(submitter__username=self.request.user.username) + .exclude(is_backlink=True) class PendingResourcesViewSet(I18nLDPViewSet): model = Resource @@ -27,4 +27,4 @@ class PendingResourcesViewSet(I18nLDPViewSet): # , language__in=self.request.user.contributor_profile.languages.all(), fields__in=self.request.user.contributor_profile.fields.all() return super().get_queryset(*args, **kwargs)\ .filter(review__status='pending')\ - .exclude(submitter__username=self.request.user.username) \ No newline at end of file + .exclude(submitter__username=self.request.user.username, is_backlink=True) \ No newline at end of file