diff --git a/TEKDB/Accounts/admin.py b/TEKDB/Accounts/admin.py index 8c38f3f3..846f6b40 100644 --- a/TEKDB/Accounts/admin.py +++ b/TEKDB/Accounts/admin.py @@ -1,3 +1 @@ -from django.contrib import admin - # Register your models here. diff --git a/TEKDB/Accounts/apps.py b/TEKDB/Accounts/apps.py index de196728..f6b9fc93 100644 --- a/TEKDB/Accounts/apps.py +++ b/TEKDB/Accounts/apps.py @@ -2,4 +2,4 @@ class AccountsConfig(AppConfig): - name = 'Accounts' + name = "Accounts" diff --git a/TEKDB/Accounts/models.py b/TEKDB/Accounts/models.py index 71a83623..6b202199 100644 --- a/TEKDB/Accounts/models.py +++ b/TEKDB/Accounts/models.py @@ -1,3 +1 @@ -from django.db import models - # Create your models here. diff --git a/TEKDB/Accounts/views.py b/TEKDB/Accounts/views.py index 91ea44a2..60f00ef0 100644 --- a/TEKDB/Accounts/views.py +++ b/TEKDB/Accounts/views.py @@ -1,3 +1 @@ -from django.shortcuts import render - # Create your views here. diff --git a/TEKDB/Lookup/admin.py b/TEKDB/Lookup/admin.py index 8c38f3f3..846f6b40 100644 --- a/TEKDB/Lookup/admin.py +++ b/TEKDB/Lookup/admin.py @@ -1,3 +1 @@ -from django.contrib import admin - # Register your models here. diff --git a/TEKDB/Lookup/apps.py b/TEKDB/Lookup/apps.py index e93c4b39..a61a1196 100644 --- a/TEKDB/Lookup/apps.py +++ b/TEKDB/Lookup/apps.py @@ -2,5 +2,5 @@ class LookupConfig(AppConfig): - name = 'Lookup' - verbose_name = 'Supplemental Lookups' + name = "Lookup" + verbose_name = "Supplemental Lookups" diff --git a/TEKDB/Lookup/models.py b/TEKDB/Lookup/models.py index 71a83623..6b202199 100644 --- a/TEKDB/Lookup/models.py +++ b/TEKDB/Lookup/models.py @@ -1,3 +1 @@ -from django.db import models - # Create your models here. diff --git a/TEKDB/Lookup/views.py b/TEKDB/Lookup/views.py index 91ea44a2..60f00ef0 100644 --- a/TEKDB/Lookup/views.py +++ b/TEKDB/Lookup/views.py @@ -1,3 +1 @@ -from django.shortcuts import render - # Create your views here. diff --git a/TEKDB/Relationships/admin.py b/TEKDB/Relationships/admin.py index 8c38f3f3..846f6b40 100644 --- a/TEKDB/Relationships/admin.py +++ b/TEKDB/Relationships/admin.py @@ -1,3 +1 @@ -from django.contrib import admin - # Register your models here. diff --git a/TEKDB/Relationships/apps.py b/TEKDB/Relationships/apps.py index 99539f7a..66419cd2 100644 --- a/TEKDB/Relationships/apps.py +++ b/TEKDB/Relationships/apps.py @@ -2,4 +2,4 @@ class RelationshipsConfig(AppConfig): - name = 'Relationships' + name = "Relationships" diff --git a/TEKDB/Relationships/models.py b/TEKDB/Relationships/models.py index 71a83623..6b202199 100644 --- a/TEKDB/Relationships/models.py +++ b/TEKDB/Relationships/models.py @@ -1,3 +1 @@ -from django.db import models - # Create your models here. diff --git a/TEKDB/Relationships/tests.py b/TEKDB/Relationships/tests.py index 7ce503c2..a39b155a 100644 --- a/TEKDB/Relationships/tests.py +++ b/TEKDB/Relationships/tests.py @@ -1,3 +1 @@ -from django.test import TestCase - # Create your tests here. diff --git a/TEKDB/Relationships/views.py b/TEKDB/Relationships/views.py index 91ea44a2..60f00ef0 100644 --- a/TEKDB/Relationships/views.py +++ b/TEKDB/Relationships/views.py @@ -1,3 +1 @@ -from django.shortcuts import render - # Create your views here. diff --git a/TEKDB/TEKDB/admin.py b/TEKDB/TEKDB/admin.py index 006435a3..497cbc54 100644 --- a/TEKDB/TEKDB/admin.py +++ b/TEKDB/TEKDB/admin.py @@ -2,26 +2,67 @@ from django.db.models.functions import Lower from django.contrib import admin from django.contrib.auth.admin import UserAdmin -from django.contrib.gis.admin import GeoModelAdmin, OSMGeoAdmin +from django.contrib.gis.admin import OSMGeoAdmin from django.utils.html import format_html -from django.utils.translation import gettext, gettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from dal import autocomplete from mimetypes import guess_type from django.templatetags.static import static + # from moderation.admin import ModerationAdmin import nested_admin from tinymce.widgets import TinyMCE from reversion.admin import VersionAdmin from .forms import MediaBulkUploadForm -from .models import * +from .models import ( + ResourcesActivityEvents, + Media, + Citations, + Places, + LookupMediaType, + LookupParticipants, + LookupTechniques, + People, + LookupReferenceType, + LookupPlanningUnit, + LookupHabitat, + LookupTribe, + PlacesResourceEvents, + MediaCitationEvents, + PlacesCitationEvents, + PlacesMediaEvents, + PlacesResourceCitationEvents, + PlacesResourceMediaEvents, + ResourceActivityMediaEvents, + ResourceActivityCitationEvents, + ResourceResourceEvents, + ResourcesCitationEvents, + ResourcesMediaEvents, + PlaceAltIndigenousName, + ResourceAltIndigenousName, + LocalityPlaceResourceEvent, + LocalityGISSelections, + MediaBulkUpload, + LookupPartUsed, + LookupSeason, + LookupTiming, + LookupActivity, + LookupResourceGroup, + Resources, + LookupCustomaryUse, + LookupAuthorType, + UserAccess, + LookupUserInfo, + Users, +) from TEKDB.settings import ADMIN_SITE_HEADER -admin.site.site_header = ADMIN_SITE_HEADER - from TEKDB.settings import BASE_DIR from TEKDB.widgets import OpenLayers6Widget +admin.site.site_header = ADMIN_SITE_HEADER + ############# ### FORMS ### @@ -32,261 +73,323 @@ class Meta: # widgets = { # 'medialink':forms.FileInput # } - fields = '__all__' + fields = "__all__" def __init__(self, *args, **kwargs): super(MediaForm, self).__init__(*args, **kwargs) - self.fields['mediatype'].queryset = LookupMediaType.objects.order_by(Lower('mediatype')) + self.fields["mediatype"].queryset = LookupMediaType.objects.order_by( + Lower("mediatype") + ) + class ResourcesActivityEventsForm(forms.ModelForm): class Meta: model = ResourcesActivityEvents widgets = { - 'placeresourceid': autocomplete.ModelSelect2(url='select2_fk_placeresource') + "placeresourceid": autocomplete.ModelSelect2(url="select2_fk_placeresource") } - fields = '__all__' + fields = "__all__" def __init__(self, *args, **kwargs): super(ResourcesActivityEventsForm, self).__init__(*args, **kwargs) - self.fields['participants'].queryset = LookupParticipants.objects.order_by(Lower('participants')) - self.fields['technique'].queryset = LookupTechniques.objects.order_by(Lower('techniques')) - self.fields['activityshortdescription'].queryset = LookupActivity.objects.order_by(Lower('activity')) + self.fields["participants"].queryset = LookupParticipants.objects.order_by( + Lower("participants") + ) + self.fields["technique"].queryset = LookupTechniques.objects.order_by( + Lower("techniques") + ) + self.fields[ + "activityshortdescription" + ].queryset = LookupActivity.objects.order_by(Lower("activity")) + class CitationsForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(CitationsForm, self).__init__(*args, **kwargs) - self.fields['referencetype'].queryset = LookupReferenceType.objects.order_by(Lower('documenttype')) + self.fields["referencetype"].queryset = LookupReferenceType.objects.order_by( + Lower("documenttype") + ) # self.fields['authortype'].queryset = LookupAuthorType.objects.order_by(Lower('authortype')) - self.fields['intervieweeid'].queryset = People.objects.order_by(Lower('firstname'), Lower('lastname')) - self.fields['interviewerid'].queryset = People.objects.order_by(Lower('firstname'), Lower('lastname')) + self.fields["intervieweeid"].queryset = People.objects.order_by( + Lower("firstname"), Lower("lastname") + ) + self.fields["interviewerid"].queryset = People.objects.order_by( + Lower("firstname"), Lower("lastname") + ) + class PlacesForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(PlacesForm, self).__init__(*args, **kwargs) - self.fields['planningunitid'].queryset = LookupPlanningUnit.objects.order_by(Lower('planningunitname')) - self.fields['primaryhabitat'].queryset = LookupHabitat.objects.order_by(Lower('habitat')) - self.fields['tribeid'].queryset = LookupTribe.objects.order_by(Lower('tribe')) + self.fields["planningunitid"].queryset = LookupPlanningUnit.objects.order_by( + Lower("planningunitname") + ) + self.fields["primaryhabitat"].queryset = LookupHabitat.objects.order_by( + Lower("habitat") + ) + self.fields["tribeid"].queryset = LookupTribe.objects.order_by(Lower("tribe")) class Meta: model = Places widgets = { - 'geometry': OpenLayers6Widget(), + "geometry": OpenLayers6Widget(), } - fields = '__all__' + fields = "__all__" + class ResourcesForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(ResourcesForm, self).__init__(*args, **kwargs) - self.fields['resourceclassificationgroup'].queryset = LookupResourceGroup.objects.order_by(Lower('resourceclassificationgroup')) + self.fields[ + "resourceclassificationgroup" + ].queryset = LookupResourceGroup.objects.order_by( + Lower("resourceclassificationgroup") + ) + class PlacesResourceEventForm(forms.ModelForm): class Meta: model = PlacesResourceEvents widgets = { - 'placeid': autocomplete.ModelSelect2(url='select2_fk_place'), - 'resourceid': autocomplete.ModelSelect2(url='select2_fk_resource'), - 'relationshipdescription': TinyMCE, + "placeid": autocomplete.ModelSelect2(url="select2_fk_place"), + "resourceid": autocomplete.ModelSelect2(url="select2_fk_resource"), + "relationshipdescription": TinyMCE, } - fields = '__all__' + fields = "__all__" def __init__(self, *args, **kwargs): super(PlacesResourceEventForm, self).__init__(*args, **kwargs) - self.fields['partused'].queryset = LookupPartUsed.objects.order_by(Lower('partused')) - self.fields['season'].queryset = LookupSeason.objects.order_by(Lower('season')) - self.fields['timing'].queryset = LookupTiming.objects.order_by(Lower('timing')) + self.fields["partused"].queryset = LookupPartUsed.objects.order_by( + Lower("partused") + ) + self.fields["season"].queryset = LookupSeason.objects.order_by(Lower("season")) + self.fields["timing"].queryset = LookupTiming.objects.order_by(Lower("timing")) + class MediaCitationEventsForm(forms.ModelForm): class Meta: model = MediaCitationEvents widgets = { - 'mediaid': autocomplete.ModelSelect2(url='select2_fk_media'), - 'citationid': autocomplete.ModelSelect2(url='select2_fk_citation'), - 'relationshipdescription': TinyMCE, + "mediaid": autocomplete.ModelSelect2(url="select2_fk_media"), + "citationid": autocomplete.ModelSelect2(url="select2_fk_citation"), + "relationshipdescription": TinyMCE, } - fields = '__all__' + fields = "__all__" + class PlacesCitationEventsForm(forms.ModelForm): class Meta: model = PlacesCitationEvents widgets = { - 'placeid': autocomplete.ModelSelect2(url='select2_fk_place'), - 'citationid': autocomplete.ModelSelect2(url='select2_fk_citation'), - 'relationshipdescription': TinyMCE, + "placeid": autocomplete.ModelSelect2(url="select2_fk_place"), + "citationid": autocomplete.ModelSelect2(url="select2_fk_citation"), + "relationshipdescription": TinyMCE, } - fields = '__all__' + fields = "__all__" + class PlacesMediaEventsForm(forms.ModelForm): class Meta: model = PlacesMediaEvents widgets = { - 'placeid': autocomplete.ModelSelect2(url='select2_fk_place'), - 'mediaid': autocomplete.ModelSelect2(url='select2_fk_media'), - 'relationshipdescription': TinyMCE, + "placeid": autocomplete.ModelSelect2(url="select2_fk_place"), + "mediaid": autocomplete.ModelSelect2(url="select2_fk_media"), + "relationshipdescription": TinyMCE, } - fields = '__all__' + fields = "__all__" + class PlacesResourceCitationEventsForm(forms.ModelForm): class Meta: model = PlacesResourceCitationEvents widgets = { - 'placeresourceid': autocomplete.ModelSelect2(url='select2_fk_placeresource'), - 'citationid': autocomplete.ModelSelect2(url='select2_fk_citation'), - 'relationshipdescription': TinyMCE(), + "placeresourceid": autocomplete.ModelSelect2( + url="select2_fk_placeresource" + ), + "citationid": autocomplete.ModelSelect2(url="select2_fk_citation"), + "relationshipdescription": TinyMCE(), } - fields = '__all__' + fields = "__all__" + class PlacesResourceMediaEventsForm(forms.ModelForm): class Meta: model = PlacesResourceMediaEvents widgets = { - 'placeresourceid': autocomplete.ModelSelect2(url='select2_fk_placeresource'), - 'mediaid': autocomplete.ModelSelect2(url='select2_fk_media'), - 'relationshipdescription': TinyMCE, + "placeresourceid": autocomplete.ModelSelect2( + url="select2_fk_placeresource" + ), + "mediaid": autocomplete.ModelSelect2(url="select2_fk_media"), + "relationshipdescription": TinyMCE, } - fields = '__all__' + fields = "__all__" + class ResourceActivityMediaEventsForm(forms.ModelForm): class Meta: model = ResourceActivityMediaEvents widgets = { - 'resourceactivityid': autocomplete.ModelSelect2(url='select2_fk_resourceactivity'), - 'mediaid': autocomplete.ModelSelect2(url='select2_fk_media'), - 'relationshipdescription': TinyMCE, + "resourceactivityid": autocomplete.ModelSelect2( + url="select2_fk_resourceactivity" + ), + "mediaid": autocomplete.ModelSelect2(url="select2_fk_media"), + "relationshipdescription": TinyMCE, } - fields = '__all__' + fields = "__all__" + class ResourceActivityCitationEventsForm(forms.ModelForm): class Meta: model = ResourceActivityCitationEvents widgets = { - 'resourceactivityid': autocomplete.ModelSelect2(url='select2_fk_resourceactivity'), - 'citationid': autocomplete.ModelSelect2(url='select2_fk_citation'), - 'relationshipdescription': TinyMCE, + "resourceactivityid": autocomplete.ModelSelect2( + url="select2_fk_resourceactivity" + ), + "citationid": autocomplete.ModelSelect2(url="select2_fk_citation"), + "relationshipdescription": TinyMCE, } - fields = '__all__' + fields = "__all__" + class ResourceResourceEventsForm(forms.ModelForm): class Meta: model = ResourceResourceEvents widgets = { - 'resourceid': autocomplete.ModelSelect2(url='select2_fk_resource'), - 'altresourceid': autocomplete.ModelSelect2(url='select2_fk_resource'), - 'relationshipdescription': TinyMCE, + "resourceid": autocomplete.ModelSelect2(url="select2_fk_resource"), + "altresourceid": autocomplete.ModelSelect2(url="select2_fk_resource"), + "relationshipdescription": TinyMCE, } - fields = '__all__' + fields = "__all__" + class ResourcesCitationEventsForm(forms.ModelForm): class Meta: model = ResourcesCitationEvents widgets = { - 'resourceid': autocomplete.ModelSelect2(url='select2_fk_resource'), - 'citationid': autocomplete.ModelSelect2(url='select2_fk_citation'), - 'relationshipdescription': TinyMCE, + "resourceid": autocomplete.ModelSelect2(url="select2_fk_resource"), + "citationid": autocomplete.ModelSelect2(url="select2_fk_citation"), + "relationshipdescription": TinyMCE, } - fields = '__all__' + fields = "__all__" class ResourcesMediaEventsForm(forms.ModelForm): class Meta: model = ResourcesMediaEvents widgets = { - 'resourceid': autocomplete.ModelSelect2(url='select2_fk_resource'), - 'mediaid': autocomplete.ModelSelect2(url='select2_fk_media'), - 'relationshipdescription': TinyMCE, + "resourceid": autocomplete.ModelSelect2(url="select2_fk_resource"), + "mediaid": autocomplete.ModelSelect2(url="select2_fk_media"), + "relationshipdescription": TinyMCE, } - fields = '__all__' - + fields = "__all__" + class PlaceAltIndigenousNameForm(forms.ModelForm): class Meta: model = PlaceAltIndigenousName - widgets = { - 'placeid': autocomplete.ModelSelect2(url='select2_fk_place') - } - fields = '__all__' + widgets = {"placeid": autocomplete.ModelSelect2(url="select2_fk_place")} + fields = "__all__" + class ResourceAltIndigenousNameForm(forms.ModelForm): class Meta: model = ResourceAltIndigenousName widgets = { - 'resourceid': autocomplete.ModelSelect2(url='select2_fk_resource'), + "resourceid": autocomplete.ModelSelect2(url="select2_fk_resource"), } - fields = '__all__' + fields = "__all__" + ############### ### INLINES ### ############### + #### ACTIVITIES #### class NestedResourcesactivitymediaeventsInline(nested_admin.NestedTabularInline): model = ResourceActivityMediaEvents - fields = ('mediaid', 'relationshipdescription', 'pages') + fields = ("mediaid", "relationshipdescription", "pages") extra = 0 - classes = ['collapse', 'open'] - verbose_name_plural = 'Related Media' + classes = ["collapse", "open"] + verbose_name_plural = "Related Media" + class NestedResourcesactivitycitationeventsInline(nested_admin.NestedTabularInline): model = ResourceActivityCitationEvents - fields = ('citationid', 'relationshipdescription', 'pages') + fields = ("citationid", "relationshipdescription", "pages") extra = 0 - classes = ['collapse', 'open'] - verbose_name_plural = 'Related Bibliographic Sources' + classes = ["collapse", "open"] + verbose_name_plural = "Related Bibliographic Sources" + #### PLACESRESOURCES #### class NestedPlacesresourcecitationeventsInline(nested_admin.NestedTabularInline): model = PlacesResourceCitationEvents - fields = ('citationid','relationshipdescription','pages') + fields = ("citationid", "relationshipdescription", "pages") extra = 0 - classes = ['collapse', 'open'] - verbose_name_plural = 'related Bibliographic Sources' + classes = ["collapse", "open"] + verbose_name_plural = "related Bibliographic Sources" form = PlacesResourceCitationEventsForm + class NestedPlacesresourcemediaeventsInline(nested_admin.NestedTabularInline): model = PlacesResourceMediaEvents - fields = ('mediaid','relationshipdescription','pages') + fields = ("mediaid", "relationshipdescription", "pages") extra = 0 - classes = ['collapse', 'open'] - verbose_name_plural = 'related media' + classes = ["collapse", "open"] + verbose_name_plural = "related media" form = PlacesResourceMediaEventsForm + class NestedPlaceresourcelocalityeventInline(nested_admin.NestedTabularInline): model = LocalityPlaceResourceEvent - fields = ('localityid',) + fields = ("localityid",) extra = 0 - classes = ['collapse', 'open'] - verbose_name_plural = 'related localities' + classes = ["collapse", "open"] + verbose_name_plural = "related localities" + class NestedPlacesresourceactivityeventInline(nested_admin.NestedStackedInline): model = ResourcesActivityEvents fieldsets = ( - ('', { - 'fields': (('participants', 'technique','relationshipdescription'), - ('activityshortdescription', 'activitylongdescription', ) - ) - }), + ( + "", + { + "fields": ( + ("participants", "technique", "relationshipdescription"), + ( + "activityshortdescription", + "activitylongdescription", + ), + ) + }, + ), ) extra = 0 - classes = ['collapse', 'open'] - verbose_name_plural = 'related Activities' + classes = ["collapse", "open"] + verbose_name_plural = "related Activities" inlines = [ NestedResourcesactivitycitationeventsInline, NestedResourcesactivitymediaeventsInline, ] + #### LOCALITIES #### class LocalityplaceresourceeventInline(admin.TabularInline): model = LocalityPlaceResourceEvent - fields = ('placeresourceid',) + fields = ("placeresourceid",) extra = 0 - classes = ['collapse', 'open'] - verbose_name_plural = 'related place-resources' + classes = ["collapse", "open"] + verbose_name_plural = "related place-resources" + class LocalityGISSelectionsInline(admin.TabularInline): model = LocalityGISSelections - fields = ('localitylabel', 'sourcefc') + fields = ("localitylabel", "sourcefc") extra = 0 - classes = ['collapse', 'open'] - verbose_name_plural = 'Locality GIS Selections' + classes = ["collapse", "open"] + verbose_name_plural = "Locality GIS Selections" + #################### ### MODEL ADMINS ### @@ -294,13 +397,21 @@ class LocalityGISSelectionsInline(admin.TabularInline): #### PROXY MODELS #### # class RecordAdminProxy(VersionAdmin, ModerationAdmin): class RecordAdminProxy(VersionAdmin): - readonly_fields = ('enteredbyname', 'enteredbytribe','enteredbytitle','enteredbydate', - 'modifiedbyname','modifiedbytribe','modifiedbytitle','modifiedbydate') + readonly_fields = ( + "enteredbyname", + "enteredbytribe", + "enteredbytitle", + "enteredbydate", + "modifiedbyname", + "modifiedbytribe", + "modifiedbytitle", + "modifiedbydate", + ) def save_model(self, request, obj, form, change): instance = form.save(commit=False) - if hasattr(instance, 'enteredbyname'): - if instance.enteredbyname == None: + if hasattr(instance, "enteredbyname"): + if instance.enteredbyname is None: instance.enteredbyname = request.user.username instance.enteredbytribe = request.user.affiliation instance.enteredbytitle = request.user.title @@ -313,8 +424,8 @@ def save_model(self, request, obj, form, change): def save_formset(self, request, form, formset, change): instances = formset.save(commit=False) for instance in instances: - if hasattr(instance, 'enteredbyname'): - if instance.enteredbyname == None: + if hasattr(instance, "enteredbyname"): + if instance.enteredbyname is None: instance.enteredbyname = request.user.username instance.enteredbytribe = request.user.affiliation instance.enteredbytitle = request.user.title @@ -323,14 +434,23 @@ def save_formset(self, request, form, formset, change): instance.modifiedbytitle = request.user.title instance.save() + class NestedRecordAdminProxy(nested_admin.NestedModelAdmin): - readonly_fields = ('enteredbyname', 'enteredbytribe','enteredbytitle','enteredbydate', - 'modifiedbyname','modifiedbytribe','modifiedbytitle','modifiedbydate') + readonly_fields = ( + "enteredbyname", + "enteredbytribe", + "enteredbytitle", + "enteredbydate", + "modifiedbyname", + "modifiedbytribe", + "modifiedbytitle", + "modifiedbydate", + ) def save_model(self, request, obj, form, change): instance = form.save(commit=False) - if hasattr(instance, 'enteredbyname'): - if instance.enteredbyname == None: + if hasattr(instance, "enteredbyname"): + if instance.enteredbyname is None: instance.enteredbyname = request.user.username instance.enteredbytribe = request.user.affiliation instance.enteredbytitle = request.user.title @@ -343,8 +463,8 @@ def save_model(self, request, obj, form, change): def save_formset(self, request, form, formset, change): instances = formset.save(commit=False) for instance in instances: - if hasattr(instance, 'enteredbyname'): - if instance.enteredbyname == None: + if hasattr(instance, "enteredbyname"): + if instance.enteredbyname is None: instance.enteredbyname = request.user.username instance.enteredbytribe = request.user.affiliation instance.enteredbytitle = request.user.title @@ -356,88 +476,129 @@ def save_formset(self, request, form, formset, change): @admin.display() def needs_Review(self, obj): if obj.needsReview: - return format_html('', obj.needsReview) + return format_html( + '', obj.needsReview + ) else: - return format_html('', obj.needsReview) + return format_html("", obj.needsReview) + #### RECORD MODELS #### # class RecordModelAdmin(VersionAdmin, ModerationAdmin): class RecordModelAdmin(VersionAdmin): - record_form = '%s/TEKDB/templates/admin/RecordForm.html' % BASE_DIR + record_form = "%s/TEKDB/templates/admin/RecordForm.html" % BASE_DIR add_form_template = record_form change_form_template = record_form @admin.display() def needs_Review(self, obj): if obj.needsReview: - return format_html('', obj.needsReview) + return format_html( + '', obj.needsReview + ) else: - return format_html('', obj.needsReview) + return format_html("", obj.needsReview) - def change_view(self, request, object_id, form_url='', extra_context={}): + def change_view(self, request, object_id, form_url="", extra_context={}): object_instance = self.model.objects.get(pk=object_id) - extra_context['related_objects'] = object_instance.get_related_objects(object_id) - return super(RecordModelAdmin, self).change_view(request, object_id, form_url, extra_context=extra_context) + extra_context["related_objects"] = object_instance.get_related_objects( + object_id + ) + return super(RecordModelAdmin, self).change_view( + request, object_id, form_url, extra_context=extra_context + ) + @admin.register(Citations) class CitationsAdmin(RecordAdminProxy, RecordModelAdmin): - list_display = ('referencetype','title_text','description_text', 'needs_Review', - 'modifiedbyname','modifiedbydate','enteredbyname','enteredbydate') + list_display = ( + "referencetype", + "title_text", + "description_text", + "needs_Review", + "modifiedbyname", + "modifiedbydate", + "enteredbyname", + "enteredbydate", + ) fieldsets = ( - (None, { - 'classes': ('citation-ref-type',), - 'fields': ('referencetype',) - }), - ('Bibliographic Source', { - 'classes': ('citation-form-fieldset',), - 'fields': ( - 'title', - 'referencetext', - ('authorprimary', 'authorsecondary'), - ('intervieweeid', 'interviewerid'), - 'date', - 'year', - ('publisher', 'publishercity'), - 'seriestitle', - ('seriesvolume','serieseditor'), - 'placeofinterview', - ('journal', 'journalpages'), - 'preparedfor', - # 'rawcitation', - 'comments', - ) - }), - ('Review', { - 'fields': ( - 'needsReview', - 'researchComments' - ) - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ) - }) + (None, {"classes": ("citation-ref-type",), "fields": ("referencetype",)}), + ( + "Bibliographic Source", + { + "classes": ("citation-form-fieldset",), + "fields": ( + "title", + "referencetext", + ("authorprimary", "authorsecondary"), + ("intervieweeid", "interviewerid"), + "date", + "year", + ("publisher", "publishercity"), + "seriestitle", + ("seriesvolume", "serieseditor"), + "placeofinterview", + ("journal", "journalpages"), + "preparedfor", + # 'rawcitation', + "comments", + ), + }, + ), + ("Review", {"fields": ("needsReview", "researchComments")}), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ) + }, + ), ) - add_form_template = '%s/TEKDB/templates/admin/CitationsForm.html' % BASE_DIR - change_form_template = '%s/TEKDB/templates/admin/CitationsForm.html' % BASE_DIR + add_form_template = "%s/TEKDB/templates/admin/CitationsForm.html" % BASE_DIR + change_form_template = "%s/TEKDB/templates/admin/CitationsForm.html" % BASE_DIR search_fields = ( - 'referencetype__documenttype', 'intervieweeid__firstname', - 'intervieweeid__lastname', 'interviewerid__lastname', - 'interviewerid__firstname', 'authortype__authortype', - 'interviewerid__village', 'intervieweeid__village', - 'interviewerid__relationshiptootherpeople', - 'intervieweeid__relationshiptootherpeople', - 'referencetext', 'authorprimary', 'authorsecondary', - 'placeofinterview', 'title', 'seriestitle', - 'seriesvolume', 'serieseditor', 'publisher', - 'publishercity', 'preparedfor', 'rawcitation', - 'comments', 'journal', - 'enteredbyname', 'enteredbytribe', 'modifiedbyname', - 'modifiedbytribe' + "referencetype__documenttype", + "intervieweeid__firstname", + "intervieweeid__lastname", + "interviewerid__lastname", + "interviewerid__firstname", + "authortype__authortype", + "interviewerid__village", + "intervieweeid__village", + "interviewerid__relationshiptootherpeople", + "intervieweeid__relationshiptootherpeople", + "referencetext", + "authorprimary", + "authorsecondary", + "placeofinterview", + "title", + "seriestitle", + "seriesvolume", + "serieseditor", + "publisher", + "publishercity", + "preparedfor", + "rawcitation", + "comments", + "journal", + "enteredbyname", + "enteredbytribe", + "modifiedbyname", + "modifiedbytribe", ) form = CitationsForm @@ -447,30 +608,33 @@ class CitationsAdmin(RecordAdminProxy, RecordModelAdmin): class MediaBulkUploadAdmin(admin.ModelAdmin): form = MediaBulkUploadForm - list_display = ('mediabulkname','mediabulkdate', - 'enteredbyname','enteredbydate') + list_display = ("mediabulkname", "mediabulkdate", "enteredbyname", "enteredbydate") def save_model(self, request, obj, form, change): super().save_model(request, obj, form, change) - places = form.cleaned_data.get('places') - resources = form.cleaned_data.get('resources') - citations = form.cleaned_data.get('citations') - activities = form.cleaned_data.get('activities') - placesresources = form.cleaned_data.get('placesresources') - - for file in request.FILES.getlist('files'): + places = form.cleaned_data.get("places") + resources = form.cleaned_data.get("resources") + citations = form.cleaned_data.get("citations") + activities = form.cleaned_data.get("activities") + placesresources = form.cleaned_data.get("placesresources") + + for file in request.FILES.getlist("files"): mime_type, _ = guess_type(file.name) # if mime_type: - file_mime_type = mime_type.split('/')[0] - media_type_instance = LookupMediaType.objects.filter(mediatype__startswith=file_mime_type).first() + file_mime_type = mime_type.split("/")[0] + media_type_instance = LookupMediaType.objects.filter( + mediatype__startswith=file_mime_type + ).first() if media_type_instance: mediatype = media_type_instance else: - media_type_instance = LookupMediaType.objects.filter(mediatype__startswith='other').first() + media_type_instance = LookupMediaType.objects.filter( + mediatype__startswith="other" + ).first() mediatype = media_type_instance - - filename = file.name.split('.')[0] - + + filename = file.name.split(".")[0] + media_instance = Media( medianame=filename, mediadescription=f'Part of the "{obj.mediabulkname}" Media Bulk Upload that was uploaded on {obj.mediabulkdate}', @@ -483,24 +647,31 @@ def save_model(self, request, obj, form, change): # Add relationships if places: for place in places: - PlacesMediaEvents.objects.create(placeid=place, mediaid=media_instance) + PlacesMediaEvents.objects.create( + placeid=place, mediaid=media_instance + ) if resources: for resource in resources: - ResourcesMediaEvents.objects.create(resourceid=resource, mediaid=media_instance) + ResourcesMediaEvents.objects.create( + resourceid=resource, mediaid=media_instance + ) if citations: for citation in citations: - MediaCitationEvents.objects.create(citationid=citation, mediaid=media_instance) + MediaCitationEvents.objects.create( + citationid=citation, mediaid=media_instance + ) if activities: for activity in activities: - ResourceActivityMediaEvents.objects.create(resourceactivityid=activity, mediaid=media_instance) + ResourceActivityMediaEvents.objects.create( + resourceactivityid=activity, mediaid=media_instance + ) if placesresources: for placeresource in placesresources: - PlacesResourceMediaEvents.objects.create(placeresourceid=placeresource, mediaid=media_instance) + PlacesResourceMediaEvents.objects.create( + placeresourceid=placeresource, mediaid=media_instance + ) - - @admin.display( - description='Thumbnails' - ) + @admin.display(description="Thumbnails") def thumbnail_gallery(self, obj): thumbnails = [] for media in obj.mediabulkupload.all(): @@ -510,53 +681,88 @@ def thumbnail_gallery(self, obj): file_name = media.mediafile.name if mime_type: - if mime_type.startswith('image'): - thumbnails.append(format_html( - '
' - '' - '
{}' - '
', media.mediafile.url, file_name)) - elif mime_type.startswith('video'): - thumbnails.append(format_html( - '
' - '' - '
{}' - '
', media.mediafile.url, mime_type, file_name)) - elif mime_type.startswith('audio'): - generic_audio_icon = static('assets/audio-x-generic.svg') - thumbnails.append(format_html( - '
' - 'Audio File' - '
{}' - '
', generic_audio_icon, file_name)) - elif mime_type.startswith('text') or 'application/msword' in mime_type or 'application/vnd' in mime_type: - generic_doc_icon = static('assets/doc-text.svg') - thumbnails.append(format_html( - '
' - 'Document File' - '
{}' - '
', generic_doc_icon, file_name)) + if mime_type.startswith("image"): + thumbnails.append( + format_html( + '
' + '' + '
{}' + "
", + media.mediafile.url, + file_name, + ) + ) + elif mime_type.startswith("video"): + thumbnails.append( + format_html( + '
' + '" + '
{}' + "
", + media.mediafile.url, + mime_type, + file_name, + ) + ) + elif mime_type.startswith("audio"): + generic_audio_icon = static("assets/audio-x-generic.svg") + thumbnails.append( + format_html( + '
' + 'Audio File' + '
{}' + "
", + generic_audio_icon, + file_name, + ) + ) + elif ( + mime_type.startswith("text") + or "application/msword" in mime_type + or "application/vnd" in mime_type + ): + generic_doc_icon = static("assets/doc-text.svg") + thumbnails.append( + format_html( + '
' + 'Document File' + '
{}' + "
", + generic_doc_icon, + file_name, + ) + ) else: # For unknown or other file types, show a generic file image - generic_file_icon = static('assets/unknown-mail.png') - thumbnails.append(format_html( + generic_file_icon = static("assets/unknown-mail.png") + thumbnails.append( + format_html( + '
' + 'File' + '
{}' + "
", + generic_file_icon, + file_name, + ) + ) + else: + # In case the MIME type could not be determined, use a generic file icon + generic_file_icon = static("assets/unknown-mail.png") + thumbnails.append( + format_html( '
' 'File' '
{}' - '
', generic_file_icon, file_name)) - else: - # In case the MIME type could not be determined, use a generic file icon - generic_file_icon = static('assets/unknown-mail.png') - thumbnails.append(format_html( - '
' - 'File' - '
{}' - '
', generic_file_icon, file_name)) + "", + generic_file_icon, + file_name, + ) + ) - return format_html(''.join(thumbnails)) + return format_html("".join(thumbnails)) def get_readonly_fields(self, request, obj=None): if obj: # If the object already exists @@ -575,236 +781,429 @@ def has_delete_permission(self, request, obj=None): def has_add_permission(self, request): return True - readonly_fields = ('thumbnail_gallery', - 'enteredbyname', 'enteredbytribe','enteredbytitle','enteredbydate') + readonly_fields = ( + "thumbnail_gallery", + "enteredbyname", + "enteredbytribe", + "enteredbytitle", + "enteredbydate", + ) fieldsets = ( - (None, { - 'fields': ('mediabulkname', 'mediabulkdescription', 'files', 'mediabulkdate', 'places', 'resources', 'citations', 'activities', 'placesresources', 'thumbnail_gallery') - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate') - ) - }), + ( + None, + { + "fields": ( + "mediabulkname", + "mediabulkdescription", + "files", + "mediabulkdate", + "places", + "resources", + "citations", + "activities", + "placesresources", + "thumbnail_gallery", + ) + }, + ), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ) + ) + }, + ), ) - @admin.register(Media) class MediaAdmin(RecordAdminProxy, RecordModelAdmin): - readonly_fields = ('medialink', - 'enteredbyname', 'enteredbytribe','enteredbytitle','enteredbydate', - 'modifiedbyname','modifiedbytribe','modifiedbytitle','modifiedbydate', - 'mediabulkupload',) - list_display = ('medianame','mediatype','needs_Review','modifiedbyname','modifiedbydate', - 'enteredbyname','enteredbydate') + readonly_fields = ( + "medialink", + "enteredbyname", + "enteredbytribe", + "enteredbytitle", + "enteredbydate", + "modifiedbyname", + "modifiedbytribe", + "modifiedbytitle", + "modifiedbydate", + "mediabulkupload", + ) + list_display = ( + "medianame", + "mediatype", + "needs_Review", + "modifiedbyname", + "modifiedbydate", + "enteredbyname", + "enteredbydate", + ) fieldsets = ( - (None, { - 'fields': (('medianame','mediatype','limitedaccess'),'mediafile','medialink','mediadescription','mediabulkupload',) - }), - ('Review', { - 'fields': ( - 'needsReview', - 'researchComments' - ) - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ) - }), + ( + None, + { + "fields": ( + ("medianame", "mediatype", "limitedaccess"), + "mediafile", + "medialink", + "mediadescription", + "mediabulkupload", + ) + }, + ), + ("Review", {"fields": ("needsReview", "researchComments")}), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ) + }, + ), ) from TEKDB.settings import BASE_DIR - add_form_template = '%s/TEKDB/templates/admin/MediaForm.html' % BASE_DIR - change_form_template = '%s/TEKDB/templates/admin/MediaForm.html' % BASE_DIR + + add_form_template = "%s/TEKDB/templates/admin/MediaForm.html" % BASE_DIR + change_form_template = "%s/TEKDB/templates/admin/MediaForm.html" % BASE_DIR search_fields = ( - 'medianame', 'mediadescription', 'medialink', - 'mediatype__mediatype', 'mediatype__mediacategory', - 'enteredbyname', 'enteredbytribe', 'modifiedbyname', - 'modifiedbytribe' + "medianame", + "mediadescription", + "medialink", + "mediatype__mediatype", + "mediatype__mediacategory", + "enteredbyname", + "enteredbytribe", + "modifiedbyname", + "modifiedbytribe", ) form = MediaForm + # class PlacesAdmin(NestedRecordAdminProxy, OSMGeoAdmin, RecordModelAdmin): @admin.register(Places) class PlacesAdmin(NestedRecordAdminProxy, RecordModelAdmin): - list_display = ('indigenousplacename','englishplacename','needs_Review','modifiedbyname', - 'modifiedbydate','enteredbyname','enteredbydate') + list_display = ( + "indigenousplacename", + "englishplacename", + "needs_Review", + "modifiedbyname", + "modifiedbydate", + "enteredbyname", + "enteredbydate", + ) fieldsets = ( - (None, { - 'fields':( - ('indigenousplacename','indigenousplacenamemeaning'), - 'englishplacename', - ('planningunitid','primaryhabitat'), - 'tribeid', - 'geometry', - ) - }), - ('Review', { - 'fields': ( - 'needsReview', - 'researchComments' - ) - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ('Source','DigitizedBy','DigitizedDate') - ) - }), + ( + None, + { + "fields": ( + ("indigenousplacename", "indigenousplacenamemeaning"), + "englishplacename", + ("planningunitid", "primaryhabitat"), + "tribeid", + "geometry", + ) + }, + ), + ("Review", {"fields": ("needsReview", "researchComments")}), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ("Source", "DigitizedBy", "DigitizedDate"), + ) + }, + ), ) search_fields = ( - 'englishplacename', 'indigenousplacename', 'indigenousplacenamemeaning', - 'planningunitid__planningunitname', 'primaryhabitat__habitat', - 'tribeid__tribeunit','tribeid__tribe','tribeid__federaltribe', - 'enteredbyname', 'enteredbytribe', 'modifiedbyname', - 'modifiedbytribe' + "englishplacename", + "indigenousplacename", + "indigenousplacenamemeaning", + "planningunitid__planningunitname", + "primaryhabitat__habitat", + "tribeid__tribeunit", + "tribeid__tribe", + "tribeid__federaltribe", + "enteredbyname", + "enteredbytribe", + "modifiedbyname", + "modifiedbytribe", ) form = PlacesForm - change_list_template = 'admin/TEKDB/places/change_list.html' + change_list_template = "admin/TEKDB/places/change_list.html" def changelist_view(self, request, extra_context=None): from .views import getPlacesGeoJSON + extra_context = extra_context or {} - extra_context['results_geojson'] = getPlacesGeoJSON(request) - return super(PlacesAdmin, self).changelist_view(request, extra_context=extra_context) + extra_context["results_geojson"] = getPlacesGeoJSON(request) + return super(PlacesAdmin, self).changelist_view( + request, extra_context=extra_context + ) + @admin.register(Resources) class ResourcesAdmin(NestedRecordAdminProxy, RecordModelAdmin): - list_display = ('commonname','indigenousname', 'needs_Review', 'modifiedbyname', - 'modifiedbydate','enteredbyname','enteredbydate') + list_display = ( + "commonname", + "indigenousname", + "needs_Review", + "modifiedbyname", + "modifiedbydate", + "enteredbyname", + "enteredbydate", + ) fieldsets = ( - (None, { - 'fields':( - ('commonname', 'indigenousname'), - ('genus', 'species'), - 'resourceclassificationgroup', - ) - }), - ('Review', { - 'fields': ( - 'needsReview', - 'researchComments' - ) - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ) - }), + ( + None, + { + "fields": ( + ("commonname", "indigenousname"), + ("genus", "species"), + "resourceclassificationgroup", + ) + }, + ), + ("Review", {"fields": ("needsReview", "researchComments")}), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ) + }, + ), ) search_fields = ( - 'commonname', 'indigenousname', 'genus', 'species', - 'resourceclassificationgroup__resourceclassificationgroup', - 'enteredbyname', 'enteredbytribe', 'modifiedbyname', - 'modifiedbytribe' + "commonname", + "indigenousname", + "genus", + "species", + "resourceclassificationgroup__resourceclassificationgroup", + "enteredbyname", + "enteredbytribe", + "modifiedbyname", + "modifiedbytribe", ) - ordering = ('commonname',) + ordering = ("commonname",) form = ResourcesForm + @admin.register(ResourcesActivityEvents) class ResourcesActivityEventsAdmin(RecordAdminProxy, RecordModelAdmin): - list_display = ('placeresourceid', 'excerpt_text', 'needs_Review', - 'modifiedbyname','modifiedbydate', 'enteredbyname','enteredbydate') + list_display = ( + "placeresourceid", + "excerpt_text", + "needs_Review", + "modifiedbyname", + "modifiedbydate", + "enteredbyname", + "enteredbydate", + ) fieldsets = ( - (None, { - 'fields': ('placeresourceid',) - }), - ('Activity', { - 'fields': ( - ('participants', 'technique'), - 'relationshipdescription', - ('partused', 'activityshortdescription'), - 'activitylongdescription', - 'gear', - 'customaryuse', - 'timing', - 'timingdescription', - ) - }), - ('Review', { - 'fields': ( - 'needsReview', - 'researchComments' - ) - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ) - }), + (None, {"fields": ("placeresourceid",)}), + ( + "Activity", + { + "fields": ( + ("participants", "technique"), + "relationshipdescription", + ("partused", "activityshortdescription"), + "activitylongdescription", + "gear", + "customaryuse", + "timing", + "timingdescription", + ) + }, + ), + ("Review", {"fields": ("needsReview", "researchComments")}), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ) + }, + ), ) search_fields = ( - 'placeresourceid__resourceid__commonname', 'placeresourceid__placeid__englishplacename', - 'placeresourceid__placeid__indigenousplacename', 'relationshipdescription', - 'activityshortdescription__activity', 'activitylongdescription', - 'participants__participants', 'technique__techniques', + "placeresourceid__resourceid__commonname", + "placeresourceid__placeid__englishplacename", + "placeresourceid__placeid__indigenousplacename", + "relationshipdescription", + "activityshortdescription__activity", + "activitylongdescription", + "participants__participants", + "technique__techniques", # 'customaryuse__usedfor', 'gear', 'timing__timing', 'timingdescription', #'partused__partused', - 'enteredbyname', 'enteredbytribe', 'enteredbytitle', 'modifiedbyname', - 'modifiedbytribe', 'modifiedbytitle' + "enteredbyname", + "enteredbytribe", + "enteredbytitle", + "modifiedbyname", + "modifiedbytribe", + "modifiedbytitle", ) form = ResourcesActivityEventsForm + class LocalityAdmin(RecordAdminProxy, OSMGeoAdmin): - list_display = ('placeid', 'englishname', 'indigenousname', - 'modifiedbyname','modifiedbydate', 'enteredbyname','enteredbydate') + list_display = ( + "placeid", + "englishname", + "indigenousname", + "modifiedbyname", + "modifiedbydate", + "enteredbyname", + "enteredbydate", + ) fieldsets = ( - (None, { - 'fields': ('placeid', 'englishname', 'indigenousname', 'geometry') - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ('Source','DigitizedBy','DigitizedDate') - ) - }), + (None, {"fields": ("placeid", "englishname", "indigenousname", "geometry")}), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ("Source", "DigitizedBy", "DigitizedDate"), + ) + }, + ), + ) + search_fields = ( + "placeid__indigenousplacename", + "placeid__englishplacename", + "englishname", + "indigenousname", + "enteredbyname", + "enteredbytribe", + "enteredbytitle", + "modifiedbyname", + "modifiedbytribe", + "modifiedbytitle", ) - search_fields = ('placeid__indigenousplacename', 'placeid__englishplacename', - 'englishname', 'indigenousname', 'enteredbyname', 'enteredbytribe', - 'enteredbytitle', 'modifiedbyname', 'modifiedbytribe', 'modifiedbytitle') inlines = [ LocalityplaceresourceeventInline, LocalityGISSelectionsInline, ] + #### RELATIONSHIP MODELS #### @admin.register(PlacesResourceEvents) class PlacesResourceEventsAdmin(NestedRecordAdminProxy): - list_display = ('placeid', 'resourceid', 'needs_Review','partused', 'season', - 'enteredbyname','enteredbydate','modifiedbyname','modifiedbydate') + list_display = ( + "placeid", + "resourceid", + "needs_Review", + "partused", + "season", + "enteredbyname", + "enteredbydate", + "modifiedbyname", + "modifiedbydate", + ) fieldsets = ( - ('', { - 'fields': (('placeid', 'resourceid'),'relationshipdescription', - ('partused', 'barterresource'), - ('season', 'timing'), - ('january', 'february', 'march', 'april', 'may', 'june'), - ('july', 'august', 'september', 'october', 'november', - 'december'), 'year', - ) - }), - ('Review', { - 'fields': ( - 'needsReview', - 'researchComments' - ) - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ) - }), + ( + "", + { + "fields": ( + ("placeid", "resourceid"), + "relationshipdescription", + ("partused", "barterresource"), + ("season", "timing"), + ("january", "february", "march", "april", "may", "june"), + ("july", "august", "september", "october", "november", "december"), + "year", + ) + }, + ), + ("Review", {"fields": ("needsReview", "researchComments")}), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ) + }, + ), ) - form=PlacesResourceEventForm + form = PlacesResourceEventForm inlines = [ NestedPlacesresourcecitationeventsInline, NestedPlacesresourcemediaeventsInline, @@ -812,219 +1211,520 @@ class PlacesResourceEventsAdmin(NestedRecordAdminProxy): NestedPlacesresourceactivityeventInline, ] + @admin.register(MediaCitationEvents) class MediaCitationEventsAdmin(RecordAdminProxy): - list_display = ('mediaid','citationid','enteredbyname','enteredbydate','modifiedbyname','modifiedbydate') + list_display = ( + "mediaid", + "citationid", + "enteredbyname", + "enteredbydate", + "modifiedbyname", + "modifiedbydate", + ) fieldsets = ( - ('', { - 'fields': (('mediaid','citationid'), 'relationshipdescription','pages') - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ) - }) + ( + "", + {"fields": (("mediaid", "citationid"), "relationshipdescription", "pages")}, + ), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ) + }, + ), ) form = MediaCitationEventsForm + @admin.register(PlacesCitationEvents) class PlacesCitationEventsAdmin(RecordAdminProxy): - list_display = ('placeid','citationid','enteredbyname','enteredbydate','modifiedbyname','modifiedbydate') + list_display = ( + "placeid", + "citationid", + "enteredbyname", + "enteredbydate", + "modifiedbyname", + "modifiedbydate", + ) fieldsets = ( - ('', { - 'fields': (('placeid','citationid'), 'relationshipdescription','pages') - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ) - }) + ( + "", + {"fields": (("placeid", "citationid"), "relationshipdescription", "pages")}, + ), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ) + }, + ), ) form = PlacesCitationEventsForm + @admin.register(PlacesMediaEvents) class PlacesMediaEventsAdmin(RecordAdminProxy): - list_display = ('placeid','mediaid','enteredbyname','enteredbydate','modifiedbyname','modifiedbydate') + list_display = ( + "placeid", + "mediaid", + "enteredbyname", + "enteredbydate", + "modifiedbyname", + "modifiedbydate", + ) fieldsets = ( - ('', { - 'fields': (('placeid','mediaid'), 'relationshipdescription','pages') - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ) - }) + ("", {"fields": (("placeid", "mediaid"), "relationshipdescription", "pages")}), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ) + }, + ), ) form = PlacesMediaEventsForm - + + @admin.register(PlaceAltIndigenousName) class PlaceAltIndigenousNameAdmin(VersionAdmin): fieldsets = ( - ('', { - 'fields': (('placeid', 'altindigenousname'),), - }), + ( + "", + { + "fields": (("placeid", "altindigenousname"),), + }, + ), ) form = PlaceAltIndigenousNameForm + @admin.register(PlacesResourceCitationEvents) class PlacesResourceCitationEventsAdmin(RecordAdminProxy): - list_display = ('placeresourceid','citationid','enteredbyname','enteredbydate','modifiedbyname','modifiedbydate') + list_display = ( + "placeresourceid", + "citationid", + "enteredbyname", + "enteredbydate", + "modifiedbyname", + "modifiedbydate", + ) fieldsets = ( - ('', { - 'fields': (('placeresourceid','citationid'), 'relationshipdescription','pages') - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ) - }) + ( + "", + { + "fields": ( + ("placeresourceid", "citationid"), + "relationshipdescription", + "pages", + ) + }, + ), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ) + }, + ), ) form = PlacesResourceCitationEventsForm + @admin.register(PlacesResourceMediaEvents) class PlacesResourceMediaEventsAdmin(RecordAdminProxy): - list_display = ('placeresourceid','mediaid','enteredbyname','enteredbydate','modifiedbyname','modifiedbydate') + list_display = ( + "placeresourceid", + "mediaid", + "enteredbyname", + "enteredbydate", + "modifiedbyname", + "modifiedbydate", + ) fieldsets = ( - ('', { - 'fields': (('placeresourceid','mediaid'), 'relationshipdescription','pages') - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ) - }) + ( + "", + { + "fields": ( + ("placeresourceid", "mediaid"), + "relationshipdescription", + "pages", + ) + }, + ), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ) + }, + ), ) form = PlacesResourceMediaEventsForm + @admin.register(ResourceActivityCitationEvents) class ResourceActivityCitationEventsAdmin(RecordAdminProxy): - list_display = ('resourceactivityid','citationid','enteredbyname','enteredbydate','modifiedbyname','modifiedbydate') + list_display = ( + "resourceactivityid", + "citationid", + "enteredbyname", + "enteredbydate", + "modifiedbyname", + "modifiedbydate", + ) fieldsets = ( - ('', { - 'fields': (('resourceactivityid','citationid'), 'relationshipdescription','pages') - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ) - }) + ( + "", + { + "fields": ( + ("resourceactivityid", "citationid"), + "relationshipdescription", + "pages", + ) + }, + ), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ) + }, + ), ) form = ResourceActivityCitationEventsForm - + + @admin.register(ResourceActivityMediaEvents) class ResourceActivityMediaEventsAdmin(RecordAdminProxy): - list_display = ('resourceactivityid','mediaid','enteredbyname','enteredbydate','modifiedbyname','modifiedbydate') + list_display = ( + "resourceactivityid", + "mediaid", + "enteredbyname", + "enteredbydate", + "modifiedbyname", + "modifiedbydate", + ) fieldsets = ( - ('', { - 'fields': (('resourceactivityid','mediaid'), 'relationshipdescription','pages') - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ) - }) + ( + "", + { + "fields": ( + ("resourceactivityid", "mediaid"), + "relationshipdescription", + "pages", + ) + }, + ), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ) + }, + ), ) form = ResourceActivityMediaEventsForm + @admin.register(ResourceResourceEvents) class ResourceResourceEventsAdmin(RecordAdminProxy): - list_display = ('resourceid','altresourceid','enteredbyname','enteredbydate','modifiedbyname','modifiedbydate') + list_display = ( + "resourceid", + "altresourceid", + "enteredbyname", + "enteredbydate", + "modifiedbyname", + "modifiedbydate", + ) fieldsets = ( - ('', { - 'fields': (('resourceid','altresourceid'), 'relationshipdescription') - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ) - }) + ("", {"fields": (("resourceid", "altresourceid"), "relationshipdescription")}), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ) + }, + ), ) form = ResourceResourceEventsForm + @admin.register(ResourcesCitationEvents) class ResourcesCitationEventsAdmin(RecordAdminProxy): - list_display = ('resourceid','citationid','enteredbyname','enteredbydate','modifiedbyname','modifiedbydate') + list_display = ( + "resourceid", + "citationid", + "enteredbyname", + "enteredbydate", + "modifiedbyname", + "modifiedbydate", + ) fieldsets = ( - ('', { - 'fields': (('resourceid','citationid'), 'relationshipdescription', 'pages') - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ) - }) + ( + "", + { + "fields": ( + ("resourceid", "citationid"), + "relationshipdescription", + "pages", + ) + }, + ), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ) + }, + ), ) form = ResourcesCitationEventsForm + @admin.register(ResourcesMediaEvents) class ResourcesMediaEventsAdmin(RecordAdminProxy): - list_display = ('resourceid','mediaid','enteredbyname','enteredbydate','modifiedbyname','modifiedbydate') + list_display = ( + "resourceid", + "mediaid", + "enteredbyname", + "enteredbydate", + "modifiedbyname", + "modifiedbydate", + ) fieldsets = ( - ('', { - 'fields': (('resourceid','mediaid'), 'relationshipdescription', 'pages') - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ) - }) + ( + "", + {"fields": (("resourceid", "mediaid"), "relationshipdescription", "pages")}, + ), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ) + }, + ), ) form = ResourcesMediaEventsForm + @admin.register(ResourceAltIndigenousName) class ResourceAltIndigenousNameAdmin(VersionAdmin): fieldsets = ( - ('', { - 'fields': (('resourceid', 'altindigenousname'),), - }), + ( + "", + { + "fields": (("resourceid", "altindigenousname"),), + }, + ), ) form = ResourceAltIndigenousNameForm + class LocalityPlaceResourceEventAdmin(RecordAdminProxy): - list_display = ('localityid','placeresourceid','enteredbyname','enteredbydate','modifiedbyname','modifiedbydate') + list_display = ( + "localityid", + "placeresourceid", + "enteredbyname", + "enteredbydate", + "modifiedbyname", + "modifiedbydate", + ) fieldsets = ( - ('', { - 'fields': (('localityid','placeresourceid'),) - }), - ('History', { - 'fields': ( - ('enteredbyname','enteredbytitle','enteredbytribe','enteredbydate'), - ('modifiedbyname','modifiedbytitle','modifiedbytribe','modifiedbydate'), - ) - }) + ("", {"fields": (("localityid", "placeresourceid"),)}), + ( + "History", + { + "fields": ( + ( + "enteredbyname", + "enteredbytitle", + "enteredbytribe", + "enteredbydate", + ), + ( + "modifiedbyname", + "modifiedbytitle", + "modifiedbytribe", + "modifiedbydate", + ), + ) + }, + ), ) + ##################### #### AUTH MODELS #### ##################### @admin.register(Users) class UsersAdmin(UserAdmin): list_display = ( - 'username', 'first_name', 'last_name', 'affiliation', - 'accesslevel','title','last_login', 'date_joined') + "username", + "first_name", + "last_name", + "affiliation", + "accesslevel", + "title", + "last_login", + "date_joined", + ) fieldsets = ( - (None, {'fields': ('username', 'password',)}), - (_('Personal info'), {'fields': ( - 'first_name', 'last_name', 'email', 'affiliation', 'title', - )}), - (_('Permissions'), {'fields': ('accesslevel',)}), - (_('Important dates'), {'fields': ('last_login', 'date_joined')}), + ( + None, + { + "fields": ( + "username", + "password", + ) + }, + ), + ( + _("Personal info"), + { + "fields": ( + "first_name", + "last_name", + "email", + "affiliation", + "title", + ) + }, + ), + (_("Permissions"), {"fields": ("accesslevel",)}), + (_("Important dates"), {"fields": ("last_login", "date_joined")}), ) search_fields = ( - 'username', 'first_name', 'last_name', 'affiliation', 'email' - 'title', 'accesslevel__accesslevel' + "username", + "first_name", + "last_name", + "affiliation", + "emailtitle", + "accesslevel__accesslevel", ) + # admin.site.register(Locality, LocalityAdmin) # admin.site.register(LocalityGISSelections) # admin.site.register(LocalityPlaceResourceEvent, LocalityPlaceResourceEventAdmin) diff --git a/TEKDB/TEKDB/apps.py b/TEKDB/TEKDB/apps.py index 284b1675..957301f6 100644 --- a/TEKDB/TEKDB/apps.py +++ b/TEKDB/TEKDB/apps.py @@ -2,6 +2,7 @@ from django.apps import AppConfig + class TEKDBConfig(AppConfig): - name = 'TEKDB' - verbose_name = 'Records' + name = "TEKDB" + verbose_name = "Records" diff --git a/TEKDB/TEKDB/context_processors.py b/TEKDB/TEKDB/context_processors.py index bedfaf12..80510962 100644 --- a/TEKDB/TEKDB/context_processors.py +++ b/TEKDB/TEKDB/context_processors.py @@ -1,43 +1,54 @@ def search_settings(request=None): try: from django.conf import settings - except Exception as e: + except Exception: try: from TEKDB import settings except Exception as e: - print('Could not import settings from TEKDB') + print("Could not import settings from TEKDB") print(e) settings = False - + try: from configuration.models import Configuration + configs = Configuration.objects.all()[0] - except Exception as e: + except Exception: configs = False search_config = { - 'MIN_SEARCH_RANK': 0.01, # Default value - 'MIN_SEARCH_SIMILARITY': 0.1, # Default + "MIN_SEARCH_RANK": 0.01, # Default value + "MIN_SEARCH_SIMILARITY": 0.1, # Default } if settings: try: search_config = { - 'MIN_SEARCH_RANK': settings.MIN_SEARCH_RANK, - 'MIN_SEARCH_SIMILARITY': settings.MIN_SEARCH_SIMILARITY, + "MIN_SEARCH_RANK": settings.MIN_SEARCH_RANK, + "MIN_SEARCH_SIMILARITY": settings.MIN_SEARCH_SIMILARITY, } - except Exception as e: - print('No MIN_SEARCH_RANK or MIN_SEARCH_SIMILARITY in settings') + except Exception: + print("No MIN_SEARCH_RANK or MIN_SEARCH_SIMILARITY in settings") pass if configs: try: + min_search_rank = ( + configs.min_search_rank + if configs.min_search_rank + else search_config["MIN_SEARCH_RANK"] + ) + min_search_similarity = ( + configs.min_search_similarity + if configs.min_search_similarity + else search_config["MIN_SEARCH_SIMILARITY"] + ) search_config = { - 'MIN_SEARCH_RANK': configs.min_search_rank if configs.min_search_rank else search_config['MIN_SEARCH_RANK'], - 'MIN_SEARCH_SIMILARITY': configs.min_search_similarity if configs.min_search_similarity else search_config['MIN_SEARCH_SIMILARITY'], + "MIN_SEARCH_RANK": min_search_rank, + "MIN_SEARCH_SIMILARITY": min_search_similarity, } - except Exception as e: - print('No min_search_rank or min_search_similarity in Configuration') + except Exception: + print("No min_search_rank or min_search_similarity in Configuration") pass return search_config @@ -46,17 +57,17 @@ def search_settings(request=None): def add_map_default_context(request): from django.conf import settings from configuration.models import Configuration - + # SET BASELINE MAP_DEFAULTS = { - 'default_lon': 0, - 'default_lat': 0, - 'default_zoom': 1, - 'map_extent': False + "default_lon": 0, + "default_lat": 0, + "default_zoom": 1, + "map_extent": False, } # Override BASELINE with any settings or local settings - if hasattr(settings, 'DATABASE_GEOGRAPHY'): + if hasattr(settings, "DATABASE_GEOGRAPHY"): for key in settings.DATABASE_GEOGRAPHY.keys(): MAP_DEFAULTS[key] = settings.DATABASE_GEOGRAPHY[key] @@ -64,14 +75,15 @@ def add_map_default_context(request): configurations = Configuration.objects.all() if configurations.count() > 0: for config in configurations: - if hasattr(config, 'geometry') and hasattr(config.geometry, 'extent') and len(config.geometry.extent) == 4: - MAP_DEFAULTS['map_extent'] = [x for x in config.geometry.extent] + if ( + hasattr(config, "geometry") + and hasattr(config.geometry, "extent") + and len(config.geometry.extent) == 4 + ): + MAP_DEFAULTS["map_extent"] = [x for x in config.geometry.extent] break - except Exception as e: + except Exception: pass return MAP_DEFAULTS - - - diff --git a/TEKDB/TEKDB/forms.py b/TEKDB/TEKDB/forms.py index aab2d27d..9808785c 100644 --- a/TEKDB/TEKDB/forms.py +++ b/TEKDB/TEKDB/forms.py @@ -1,6 +1,13 @@ from django import forms from django.contrib.admin.widgets import FilteredSelectMultiple -from .models import MediaBulkUpload, Media, Places, Resources, Citations, ResourcesActivityEvents, PlacesResourceEvents +from .models import ( + MediaBulkUpload, + Places, + Resources, + Citations, + ResourcesActivityEvents, + PlacesResourceEvents, +) from .widgets import ThumbnailFileInput @@ -17,35 +24,45 @@ def clean(self, data, initial=None): result = [single_file_clean(data, initial)] return result + class MediaBulkUploadForm(forms.ModelForm): files = MultipleFileField() places = forms.ModelMultipleChoiceField( - queryset=Places.objects.all(), + queryset=Places.objects.all(), required=False, - widget=FilteredSelectMultiple("Places", is_stacked=False) + widget=FilteredSelectMultiple("Places", is_stacked=False), ) resources = forms.ModelMultipleChoiceField( - queryset=Resources.objects.all(), + queryset=Resources.objects.all(), required=False, - widget=FilteredSelectMultiple("Resources", is_stacked=False) + widget=FilteredSelectMultiple("Resources", is_stacked=False), ) citations = forms.ModelMultipleChoiceField( - queryset=Citations.objects.all(), + queryset=Citations.objects.all(), required=False, - widget=FilteredSelectMultiple("Citations", is_stacked=False) + widget=FilteredSelectMultiple("Citations", is_stacked=False), ) activities = forms.ModelMultipleChoiceField( - queryset=ResourcesActivityEvents.objects.all(), + queryset=ResourcesActivityEvents.objects.all(), required=False, - widget=FilteredSelectMultiple("Activities", is_stacked=False) + widget=FilteredSelectMultiple("Activities", is_stacked=False), ) placesresources = forms.ModelMultipleChoiceField( - queryset=PlacesResourceEvents.objects.all(), + queryset=PlacesResourceEvents.objects.all(), required=False, - widget=FilteredSelectMultiple("Places Resources", is_stacked=False) + widget=FilteredSelectMultiple("Places Resources", is_stacked=False), ) class Meta: model = MediaBulkUpload - fields = ['mediabulkname', 'mediabulkdescription', 'mediabulkdate', 'files', 'places', 'resources', 'citations', 'activities', 'placesresources'] - \ No newline at end of file + fields = [ + "mediabulkname", + "mediabulkdescription", + "mediabulkdate", + "files", + "places", + "resources", + "citations", + "activities", + "placesresources", + ] diff --git a/TEKDB/TEKDB/management/commands/export_db.py b/TEKDB/TEKDB/management/commands/export_db.py index 689bb059..f5babdad 100644 --- a/TEKDB/TEKDB/management/commands/export_db.py +++ b/TEKDB/TEKDB/management/commands/export_db.py @@ -1,22 +1,19 @@ from django.core import management -from django.core.management.base import BaseCommand, CommandError +from django.core.management.base import BaseCommand from django.conf import settings from datetime import datetime -import io -import os, sys -import shutil -from TEKDB.models import * +import os import tempfile import zipfile -class Command(BaseCommand): - help = 'Exports current content of database to /tmp/' +class Command(BaseCommand): + help = "Exports current content of database to /tmp/" def handle(self, *args, **options): - datestamp = datetime.now().strftime('%Y%m%d') + datestamp = datetime.now().strftime("%Y%m%d") outfile = "/tmp/{}_backup.zip".format(datestamp) - os.chdir(os.path.join(settings.MEDIA_ROOT, '..')) + os.chdir(os.path.join(settings.MEDIA_ROOT, "..")) relative_media_directory = settings.MEDIA_ROOT.split(os.path.sep)[-1] # media_paths = get_all_file_paths(relative_media_directory, cwd=os.getcwd()) media_paths = [] @@ -31,17 +28,17 @@ def handle(self, *args, **options): # create filename dumpfile = "{}_backup.json".format(datestamp) dumpfile_location = os.path.join(tmp_dir, dumpfile) - with open(dumpfile_location, 'w') as of: - management.call_command('dumpdata', '--indent=2', stdout=of) + with open(dumpfile_location, "w") as of: + management.call_command("dumpdata", "--indent=2", stdout=of) # zip up: # * Data Dump file # * Media files - with zipfile.ZipFile(outfile, 'w') as zip: + with zipfile.ZipFile(outfile, "w") as zip: zip.write(dumpfile_location, dumpfile) for media_file in media_paths: zip.write(media_file) print("Export complete. Find your file at: {}".format(outfile)) - + except Exception as e: print("Unknown Error Exporting Data: {}".format(e)) diff --git a/TEKDB/TEKDB/management/commands/import_shp.py b/TEKDB/TEKDB/management/commands/import_shp.py index 99a42509..cb4d836f 100644 --- a/TEKDB/TEKDB/management/commands/import_shp.py +++ b/TEKDB/TEKDB/management/commands/import_shp.py @@ -1,31 +1,27 @@ -from django.core.management.base import BaseCommand, CommandError -import os, sys +from django.core.management.base import BaseCommand +import os # from TEKDB.models import * # from TEKDB.settings import * -class Command(BaseCommand): - help = 'Imports spatial data from a separate PostGIS database with schema matching old db' +class Command(BaseCommand): + help = "Imports spatial data from a separate PostGIS database with schema matching old db" def add_arguments(self, parser): - parser.add_argument('infile', nargs='+', type=str) + parser.add_argument("infile", nargs="+", type=str) def handle(self, *args, **options): from django.contrib.gis.gdal import DataSource - import pytz from pytz import timezone from datetime import datetime FILE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - MANAGE_DIR = os.path.join(FILE_DIR,'..','..') - import_output = os.path.join(MANAGE_DIR, 'scripts','import_shp_output.txt') - import_error = os.path.join(MANAGE_DIR, 'scripts','import_shp_output.txt') - manage_py = os.path.join(MANAGE_DIR, 'manage.py') - infile = os.path.normpath(os.path.join(MANAGE_DIR, options['infile'][0])) + MANAGE_DIR = os.path.join(FILE_DIR, "..", "..") + infile = os.path.normpath(os.path.join(MANAGE_DIR, options["infile"][0])) if not os.path.exists(infile): - print('File not found: %s' % infile) + print("File not found: %s" % infile) quit() - if not infile[-4:] == '.shp': + if not infile[-4:] == ".shp": print('Please provide shapefile name ending in ".shp".') quit() @@ -34,71 +30,132 @@ def handle(self, *args, **options): layer = ds[0] # TODO: Can we detect the srs and convert to 3857 on the fly? print("SRID: %s" % layer.srs.srid) - fields = layer.fields + fields = layer.fields - if not 'PlaceID' in fields: - print('This is not a valid shapefile - no PlaceID field found. Available given: %s' % str(fields)) + if "PlaceID" not in fields: + print( + "This is not a valid shapefile - no PlaceID field found. Available given: %s" + % str(fields) + ) quit() - from TEKDB.models import Places, Locality, LookupPlanningUnit, LookupHabitat, LookupLocalityType - if 'LocalityID' in fields: + from TEKDB.models import ( + Places, + Locality, + LookupHabitat, + LookupLocalityType, + ) + + if "LocalityID" in fields: model = Locality - pk_field = 'LocalityID' - label_field = 'LocalityLa' - description_field = 'LocalityDe' + pk_field = "LocalityID" + label_field = "LocalityLa" + description_field = "LocalityDe" else: model = Places - pk_field = 'PlaceID' - label_field = 'PlaceLabel' - description_field = 'PlaceDescr' + pk_field = "PlaceID" + label_field = "PlaceLabel" + description_field = "PlaceDescr" for geom_index, feature in enumerate(layer.get_geoms()): pk = layer.get_fields(pk_field)[geom_index] try: (record, created) = model.objects.get_or_create(pk=pk) from TEKDB.settings import TIME_ZONE + local_tz = timezone(TIME_ZONE) - record_date = local_tz.localize(datetime.combine(layer.get_fields('DigitizedD')[geom_index], datetime.min.time())) + record_date = local_tz.localize( + datetime.combine( + layer.get_fields("DigitizedD")[geom_index], + datetime.min.time(), + ) + ) if created: - print('No DB record for %s (ID: %s) found. Creating a new one...' % (layer.get_fields(label_field)[geom_index], str(pk))) + print( + "No DB record for %s (ID: %s) found. Creating a new one..." + % (layer.get_fields(label_field)[geom_index], str(pk)) + ) if model == Locality: - place = Places.objects.filter(pk=layer.get_fields('PlaceID')[geom_index]) + place = Places.objects.filter( + pk=layer.get_fields("PlaceID")[geom_index] + ) if len(place) == 1: record.placeid = place[0] - record.englishname = layer.get_fields(label_field)[geom_index] - record.indigenousname = layer.get_fields(label_field)[geom_index] - (localitytype, lt_created) = LookupLocalityType.objects.get_or_create(localitytype__iexact=layer.get_fields('FeatType')[geom_index]) + record.englishname = layer.get_fields(label_field)[ + geom_index + ] + record.indigenousname = layer.get_fields(label_field)[ + geom_index + ] + (localitytype, lt_created) = ( + LookupLocalityType.objects.get_or_create( + localitytype__iexact=layer.get_fields("FeatType")[ + geom_index + ] + ) + ) if lt_created: - localitytype.localitytype = layer.get_fields('FeatType')[geom_index] + localitytype.localitytype = layer.get_fields( + "FeatType" + )[geom_index] localitytype.save() - print('Created Locality Type: %s (ID: %s)' % (localitytype.localitytype, localitytype.id)) + print( + "Created Locality Type: %s (ID: %s)" + % (localitytype.localitytype, localitytype.id) + ) record.localitytype = localitytype else: - record.indigenousplacename = layer.get_fields(label_field)[geom_index] - record.indigenousplacenamemeaning = layer.get_fields(description_field)[geom_index] - record.englishplacename = layer.get_fields(label_field)[geom_index] - (habitat, hab_created) = LookupHabitat.objects.get_or_create(habitat__iexact=layer.get_fields('FeatType')[geom_index]) + record.indigenousplacename = layer.get_fields(label_field)[ + geom_index + ] + record.indigenousplacenamemeaning = layer.get_fields( + description_field + )[geom_index] + record.englishplacename = layer.get_fields(label_field)[ + geom_index + ] + (habitat, hab_created) = ( + LookupHabitat.objects.get_or_create( + habitat__iexact=layer.get_fields("FeatType")[ + geom_index + ] + ) + ) if hab_created: - habitat.habitat = layer.get_fields('FeatType')[geom_index] + habitat.habitat = layer.get_fields("FeatType")[ + geom_index + ] habitat.save() - print('Created Habitat: %s (ID: %s)' % (habitat.habitat, habitat.id)) + print( + "Created Habitat: %s (ID: %s)" + % (habitat.habitat, habitat.id) + ) record.primaryhabitat = habitat - record.enteredbyname = layer.get_fields('DigitizedB')[geom_index] + record.enteredbyname = layer.get_fields("DigitizedB")[ + geom_index + ] record.enteredbydate = record_date - record.modifiedbyname = layer.get_fields('DigitizedB')[geom_index] + record.modifiedbyname = layer.get_fields("DigitizedB")[ + geom_index + ] record.modifiedbydate = record_date record.geometry = feature.geos - record.Source = layer.get_fields('Source')[geom_index] - record.DigitizedBy = layer.get_fields('DigitizedB')[geom_index] + record.Source = layer.get_fields("Source")[geom_index] + record.DigitizedBy = layer.get_fields("DigitizedB")[geom_index] record.DigitizedDate = record_date record.save() - except: - print('Error editing %s record with ID: %s' % (model, str(pk))) + except Exception as e: + print( + "Error editing %s record with ID: %s; error msg: %s" + % (model, str(pk), e) + ) except Exception: - print('An unexpected error occurred while trying to read the \ + print( + "An unexpected error occurred while trying to read the \ shapefile. Please be sure the shapefile exists as given in your \ arguments and that it is unzipped and has the Place or Locality \ -data you wish to import and try again.') +data you wish to import and try again." + ) quit() diff --git a/TEKDB/TEKDB/management/commands/import_sql.py b/TEKDB/TEKDB/management/commands/import_sql.py index ac885bd6..f010dd03 100644 --- a/TEKDB/TEKDB/management/commands/import_sql.py +++ b/TEKDB/TEKDB/management/commands/import_sql.py @@ -1,92 +1,94 @@ -from django.core.management.base import BaseCommand, CommandError -from TEKDB.models import * -import os, sys -from TEKDB.settings import * +from django.core.management.base import BaseCommand +import os +from TEKDB.models import * # noqa: F403 +from TEKDB.settings import * # noqa: F403 from django.utils import timezone from django.contrib.auth.models import Group, Permission from django.contrib.contenttypes.models import ContentType from django import db -class Command(BaseCommand): - help = 'Imports and rearranges SQL for PostgreSQL generated by Bullzip from Access DB' +class Command(BaseCommand): + help = ( + "Imports and rearranges SQL for PostgreSQL generated by Bullzip from Access DB" + ) def add_arguments(self, parser): - parser.add_argument('infile', nargs='+', type=str) - parser.add_argument('revert', nargs='*', type=bool) + parser.add_argument("infile", nargs="+", type=str) + parser.add_argument("revert", nargs="*", type=bool) def create_groups(self): - admin_group, created = Group.objects.get_or_create(name='Administrator') + admin_group, created = Group.objects.get_or_create(name="Administrator") admin_group_id = admin_group.id - edit_group, created = Group.objects.get_or_create(name='Editor') + edit_group, created = Group.objects.get_or_create(name="Editor") edit_group_id = edit_group.id - read_group, created = Group.objects.get_or_create(name='Reader') + read_group, created = Group.objects.get_or_create(name="Reader") read_group_id = read_group.id admin_add_perms = Permission.objects.all() admin_group.permissions.set(admin_add_perms) from django.db.models import Q + cts = ContentType.objects.filter( - Q(app_label='TEKDB') | - Q(app_label='Relationships') + Q(app_label="TEKDB") | Q(app_label="Relationships") ) edit_add_perms = Permission.objects.filter(content_type__in=cts) edit_group.permissions.set(edit_add_perms) return { - 'admin_id': admin_group_id, - 'edit_id': edit_group_id, - 'read_id': read_group_id + "admin_id": admin_group_id, + "edit_id": edit_group_id, + "read_id": read_group_id, } def get_model_list(self): return [ - 'lookupplanningunit', - 'lookuptribe', - 'lookuphabitat', - 'places', - 'lookupresourcegroup', - 'resources', - 'lookuppartused', - 'lookupcustomaryuse', - 'lookupseason', - 'lookuptiming', - 'placesresourceevents', - 'lookupparticipants', - 'lookuptechniques', - 'lookupactivity', - 'resourcesactivityevents', - 'people', - 'lookupreferencetype', - 'lookupauthortype', - 'citations', - 'placescitationevents', - 'currentversion', - 'lookuplocalitytype', - 'locality', - 'localitygisselections', - 'localityplaceresourceevent', - 'lookupmediatype', - 'lookupuserinfo', - 'media', - 'mediacitationevents', - 'placealtindigenousname', - 'placegisselections', - 'placesmediaevents', - 'placesresourcecitationevents', - 'placesresourcemediaevents', - 'resourceactivitycitationevents', - 'resourceactivitymediaevents', - 'resourcealtindigenousname', - 'resourceresourceevents', - 'resourcescitationevents', - 'resourcesmediaevents', - 'useraccess', - 'users', + "lookupplanningunit", + "lookuptribe", + "lookuphabitat", + "places", + "lookupresourcegroup", + "resources", + "lookuppartused", + "lookupcustomaryuse", + "lookupseason", + "lookuptiming", + "placesresourceevents", + "lookupparticipants", + "lookuptechniques", + "lookupactivity", + "resourcesactivityevents", + "people", + "lookupreferencetype", + "lookupauthortype", + "citations", + "placescitationevents", + "currentversion", + "lookuplocalitytype", + "locality", + "localitygisselections", + "localityplaceresourceevent", + "lookupmediatype", + "lookupuserinfo", + "media", + "mediacitationevents", + "placealtindigenousname", + "placegisselections", + "placesmediaevents", + "placesresourcecitationevents", + "placesresourcemediaevents", + "resourceactivitycitationevents", + "resourceactivitymediaevents", + "resourcealtindigenousname", + "resourceresourceevents", + "resourcescitationevents", + "resourcesmediaevents", + "useraccess", + "users", ] - def create_sql_dict(self,infile): - import string + def create_sql_dict(self, infile): import re import shlex + now = timezone.now() ############################################ print("Generating insert script") @@ -98,37 +100,37 @@ def create_sql_dict(self,infile): lookups = [ # 'lookupplanningunit', #Already has a numeric auto pk # 'lookuptribe', #Already has a numeric auto pk - 'lookuphabitat', - 'lookupresourcegroup', - 'lookuppartused', - 'lookupcustomaryuse', - 'lookupseason', - 'lookuptiming', - 'lookupparticipants', - 'lookuptechniques', - 'lookupactivity', - 'lookupreferencetype', - 'lookupauthortype', - 'lookuplocalitytype', - 'lookupmediatype', + "lookuphabitat", + "lookupresourcegroup", + "lookuppartused", + "lookupcustomaryuse", + "lookupseason", + "lookuptiming", + "lookupparticipants", + "lookuptechniques", + "lookupactivity", + "lookupreferencetype", + "lookupauthortype", + "lookuplocalitytype", + "lookupmediatype", # 'lookupuserinfo', #Not used as an FK anywhere ] lookup_pks = { # 'lookupplanningunit': '"planningunitid"', #Already has a numeric auto pk # 'lookuptribe': '"id"', #Already has a numeric auto pk - 'lookuphabitat': '"habitat"', - 'lookupresourcegroup': '"resourceclassificationgroup"', - 'lookuppartused': '"partused"', - 'lookupcustomaryuse': '"usedfor"', - 'lookupseason': '"season"', - 'lookuptiming': '"timing"', - 'lookupparticipants': '"participants"', - 'lookuptechniques': '"techniques"', - 'lookupactivity': '"activity"', - 'lookupreferencetype': '"documenttype"', - 'lookupauthortype': '"authortype"', - 'lookuplocalitytype': '"localitytype"', - 'lookupmediatype': '"mediatype"', + "lookuphabitat": '"habitat"', + "lookupresourcegroup": '"resourceclassificationgroup"', + "lookuppartused": '"partused"', + "lookupcustomaryuse": '"usedfor"', + "lookupseason": '"season"', + "lookuptiming": '"timing"', + "lookupparticipants": '"participants"', + "lookuptechniques": '"techniques"', + "lookupactivity": '"activity"', + "lookupreferencetype": '"documenttype"', + "lookupauthortype": '"authortype"', + "lookuplocalitytype": '"localitytype"', + "lookupmediatype": '"mediatype"', # 'lookupuserinfo': '"pk"', #Not used as an FK anywhere } lookup_indices = {} @@ -136,47 +138,41 @@ def create_sql_dict(self,infile): lookup_values = {} for lookup in lookups: lookup_indices[lookup] = 0 - lookup_values[lookup] = { - 'NULL': 'NULL' - } + lookup_values[lookup] = {"NULL": "NULL"} # { 'Rocky Shore': 7 } # create list of models with lookup dependencies lookup_dependencies = { - 'citations': { - '"referencetype"': 'lookupreferencetype', - '"authortype"': 'lookupauthortype' - }, - 'locality': { - '"localitytype"': 'lookuplocalitytype' + "citations": { + '"referencetype"': "lookupreferencetype", + '"authortype"': "lookupauthortype", }, - 'media': { - '"mediatype"': 'lookupmediatype' + "locality": {'"localitytype"': "lookuplocalitytype"}, + "media": {'"mediatype"': "lookupmediatype"}, + "places": { + '"primaryhabitat"': "lookuphabitat", }, - 'places': { - '"primaryhabitat"': 'lookuphabitat', + "placesresourceevents": { + '"partused"': "lookuppartused", + '"customaryuse"': "lookupcustomaryuse", + '"season"': "lookupseason", + '"timing"': "lookuptiming", }, - 'placesresourceevents': { - '"partused"': 'lookuppartused', - '"customaryuse"': 'lookupcustomaryuse', - '"season"': 'lookupseason', - '"timing"': 'lookuptiming' + "resources": { + '"resourceclassificationgroup"': "lookupresourcegroup", }, - 'resources': { - '"resourceclassificationgroup"': 'lookupresourcegroup', + "resourcesactivityevents": { + '"partused"': "lookuppartused", + '"timing"': "lookuptiming", + '"participants"': "lookupparticipants", + '"technique"': "lookuptechniques", + '"activityshortdescription"': "lookupactivity", }, - 'resourcesactivityevents': { - '"partused"': 'lookuppartused', - '"timing"': 'lookuptiming', - '"participants"': 'lookupparticipants', - '"technique"': 'lookuptechniques', - '"activityshortdescription"': 'lookupactivity', - } } for model in model_list: insert_dict[model] = { - 'inserts': [], - 'selects': [], - 'indices': [], + "inserts": [], + "selects": [], + "indices": [], } with open(infile) as rf: reg_match = r'(E\'".+?(?!\\)"\'|E\'.*?(?!\\)\'|.+?)(?:,\s|$)' @@ -185,35 +181,47 @@ def create_sql_dict(self,infile): # reg_match = r'(E\'".+?(?!\\)"\'{0,2}\'|E\'.*?(?!\\)\'{0,2}\'|.+?)(?:,\s|$)' for line in rf: - if "INSERT INTO \"" in line: - pattern = re.compile(r'INSERT INTO "(?P.*)" \((?P.*)\) VALUES \((?P.*)\);') + if 'INSERT INTO "' in line: + pattern = re.compile( + r'INSERT INTO "(?P
.*)" \((?P.*)\) VALUES \((?P.*)\);' + ) result = pattern.match(line) - model = result.groupdict()['table'].lower() + model = result.groupdict()["table"].lower() if model in model_list: - columns_lex = shlex.shlex(result.groupdict()['columns']) + columns_lex = shlex.shlex(result.groupdict()["columns"]) columns_lex.quotes = '"' columns = list(columns_lex) - columns = list(filter((',').__ne__, columns)) + columns = list(filter((",").__ne__, columns)) columns = [x.lower() for x in columns] - values = re.findall(reg_match, result.groupdict()['values']) + values = re.findall(reg_match, result.groupdict()["values"]) if len(columns) != len(values): import ipdb + ipdb.set_trace() # This is left in place so that any detected mismatches can be fixed by hand now. print(values) - if model == "users": - columns = columns + ['"is_superuser"', '"is_staff"', '"is_active"', '"date_joined"'] - values = values + ["E'0'", "E'0'", "E'1'", "'%s'" % str(now)] + columns = columns + [ + '"is_superuser"', + '"is_staff"', + '"is_active"', + '"date_joined"', + ] + values = values + [ + "E'0'", + "E'0'", + "E'1'", + "'%s'" % str(now), + ] elif model == "useraccess": accessLevelIndex = columns.index('"accesslevel"') - if values[accessLevelIndex] == "E'Administrator'" : - group_id = group_id_dict['admin_id'] + if values[accessLevelIndex] == "E'Administrator'": + group_id = group_id_dict["admin_id"] elif values[accessLevelIndex] == "E'Editor'": - group_id = group_id_dict['edit_id'] + group_id = group_id_dict["edit_id"] else: - group_id = group_id_dict['read_id'] + group_id = group_id_dict["read_id"] columns = columns + ['"group_id"'] values = values + [str(group_id)] if model in lookups: @@ -225,99 +233,113 @@ def create_sql_dict(self,infile): pk_index = columns.index(pk_field) except Exception: import ipdb + ipdb.set_trace() pk_value = values[pk_index] - if not pk_value in lookup_values[model].keys(): + if pk_value not in lookup_values[model].keys(): lookup_values[model][pk_value] = str(record_id) lookup_indices[model] = record_id + 1 - insert_dict[model]['inserts'].append({ - 'table': model, - 'columns': columns, - 'values': values - }) + insert_dict[model]["inserts"].append( + {"table": model, "columns": columns, "values": values} + ) else: - print('%s - not found in Model List.' % model) + print("%s - not found in Model List." % model) elif "SELECT setval(" in line: # SELECT setval('"Users_UserID_seq"', MAX("UserID")) FROM "Users"; - pattern = re.compile(r'SELECT setval\(\'(?P.*)\', MAX\((?P.*)\)\) FROM "(?P
.*)";') + pattern = re.compile( + r'SELECT setval\(\'(?P.*)\', MAX\((?P.*)\)\) FROM "(?P
.*)";' + ) result = pattern.match(line) - model = result.groupdict()['table'].lower() + model = result.groupdict()["table"].lower() if model in model_list: - column = result.groupdict()['column'].lower() - sequence = result.groupdict()['sequence'].lower() - insert_dict[model]['selects'].append({ - 'sequence': sequence, - 'table': model, - 'column': column - }) + column = result.groupdict()["column"].lower() + sequence = result.groupdict()["sequence"].lower() + insert_dict[model]["selects"].append( + {"sequence": sequence, "table": model, "column": column} + ) else: - print('%s - not found in Model List.' % model) + print("%s - not found in Model List." % model) elif "CREATE INDEX " in line: # CREATE INDEX "Users_UserID" ON "Users" ("UserID"); - pattern = re.compile(r'CREATE INDEX "(?P.*)" ON "(?P
.*)"\s(?:USING\s.*\s)?\((?P.*)\);(?:\\n)?') + pattern = re.compile( + r'CREATE INDEX "(?P.*)" ON "(?P
.*)"\s(?:USING\s.*\s)?\((?P.*)\);(?:\\n)?' + ) result = pattern.match(line) if result: - model = result.groupdict()['table'].lower() + model = result.groupdict()["table"].lower() if model in model_list: - columns = result.groupdict()['columns'].lower() - index = result.groupdict()['index'].lower() - insert_dict[model]['indices'].append({ - 'index': index, - 'table': model, - 'columns': columns - }) + columns = result.groupdict()["columns"].lower() + index = result.groupdict()["index"].lower() + insert_dict[model]["indices"].append( + {"index": index, "table": model, "columns": columns} + ) else: - print('%s - not found in Model List.' % model) + print("%s - not found in Model List." % model) # else: # print('Line does not match CREATE INDEX pattern: %s' % line) - #TODO: when done: - #TODO: For each user: - #TODO: Check access-level and adjust 'is_superuser' and 'is_staff' accordingly - #TODO: or see that groups are appropriate + # TODO: when done: + # TODO: For each user: + # TODO: Check access-level and adjust 'is_superuser' and 'is_staff' accordingly + # TODO: or see that groups are appropriate for model in lookup_dependencies.keys(): - for insert_rec in insert_dict[model]['inserts']: + for insert_rec in insert_dict[model]["inserts"]: for lookup in lookup_dependencies[model].keys(): # get index of lookup fk field - lookup_index = insert_rec['columns'].index(lookup) + lookup_index = insert_rec["columns"].index(lookup) # get old char pk value for fk lookup model - char_pk_value = insert_rec['values'][lookup_index] + char_pk_value = insert_rec["values"][lookup_index] # get model of lookup fk lookup_model = lookup_dependencies[model][lookup] # Check to be sure lookup_value exists and has an associated ID - if not char_pk_value in lookup_values[lookup_model].keys(): + if char_pk_value not in lookup_values[lookup_model].keys(): lookup_record_id = lookup_indices[lookup_model] - lookup_values[lookup_model][char_pk_value] = str(lookup_record_id) + lookup_values[lookup_model][char_pk_value] = str( + lookup_record_id + ) lookup_indices[lookup_model] = lookup_record_id + 1 - insert_dict[lookup_model]['inserts'].append({ - 'table': lookup_model, - 'columns': ['"id"', lookup_pks[lookup_model]], - 'values': [str(lookup_record_id), char_pk_value] - }) + insert_dict[lookup_model]["inserts"].append( + { + "table": lookup_model, + "columns": ['"id"', lookup_pks[lookup_model]], + "values": [str(lookup_record_id), char_pk_value], + } + ) # get int pk value from old char pk value lookup_id = lookup_values[lookup_model][char_pk_value] - insert_rec['values'][lookup_index] = lookup_id + insert_rec["values"][lookup_index] = lookup_id return insert_dict - def create_insert_script(self, insert_script,insert_dict): + def create_insert_script(self, insert_script, insert_dict): model_list = self.get_model_list() with open(insert_script, "w") as wf: for model in model_list: - for insert in insert_dict[model]['inserts']: - line = 'INSERT INTO "%s" (%s) VALUES (%s);\n' % (insert['table'], ', '.join(insert['columns']), ', '.join(insert['values'])) + for insert in insert_dict[model]["inserts"]: + line = 'INSERT INTO "%s" (%s) VALUES (%s);\n' % ( + insert["table"], + ", ".join(insert["columns"]), + ", ".join(insert["values"]), + ) wf.write(line) - for select in insert_dict[model]['selects']: - line = 'SELECT setval(\'%s\', MAX(%s)) FROM "%s";\n' % (select['sequence'], select['column'], select['table']) + for select in insert_dict[model]["selects"]: + line = "SELECT setval('%s', MAX(%s)) FROM \"%s\";\n" % ( + select["sequence"], + select["column"], + select["table"], + ) wf.write(line) - for index in insert_dict[model]['indices']: - line = 'CREATE INDEX "%s" ON "%s" (%s);\n' % (index['index'], index['table'], index['columns']) + for index in insert_dict[model]["indices"]: + line = 'CREATE INDEX "%s" ON "%s" (%s);\n' % ( + index["index"], + index["table"], + index["columns"], + ) wf.write(line) - def get_app_list(self): - return ['TEKDB', 'Lookup', 'Accounts', 'Relationships', 'explore'] + return ["TEKDB", "Lookup", "Accounts", "Relationships", "explore"] def revert_migrations(self, manage_py): ############################################ @@ -331,15 +353,20 @@ def delete_old_migrations(self, MANAGE_DIR): print("Deleting migration files...") ############################################ from pathlib import Path + for module in self.get_app_list(): - migrations_path = os.path.join(MANAGE_DIR,module,'migrations') + migrations_path = os.path.join(MANAGE_DIR, module, "migrations") migrations = Path(migrations_path) - migration_files = [x for x in migrations.iterdir() if not x.name == '__init__.py' and not x.is_dir()] + migration_files = [ + x + for x in migrations.iterdir() + if not x.name == "__init__.py" and not x.is_dir() + ] for migration_file in migration_files: try: os.remove(str(migration_file)) - print('%s deleted' % migration_file.name) - except OSError as e: + print("%s deleted" % migration_file.name) + except OSError: pass def rebuild_db(self, dbname, manage_py): @@ -347,13 +374,14 @@ def rebuild_db(self, dbname, manage_py): print("Dropping Database") ############################################ import psycopg2 + db.connections.close_all() conn_psql = psycopg2.connect("dbname=postgres user=postgres") cur_psql = conn_psql.cursor() conn_psql.set_isolation_level(0) - cur_psql.execute('DROP DATABASE if exists %s;' % dbname) + cur_psql.execute("DROP DATABASE if exists %s;" % dbname) print("Recreating Database") - cur_psql.execute('CREATE DATABASE %s;' % dbname) + cur_psql.execute("CREATE DATABASE %s;" % dbname) cur_psql.close() conn_psql.close() @@ -367,57 +395,71 @@ def rebuild_db(self, dbname, manage_py): ############################################ os.system("%s migrate" % manage_py) - def import_sql_data(self,import_output,import_error,dbname,insert_script): + def import_sql_data(self, import_output, import_error, dbname, insert_script): ############################################ print("Transferring old data into new database") ############################################ from subprocess import call - stdout = open(import_output, 'wb') - stderr = open(import_error, 'wb') - call(['psql', '-U', 'postgres', '-d', dbname, '-f', insert_script], stdout=stdout, stderr=stderr) + + stdout = open(import_output, "wb") + stderr = open(import_error, "wb") + call( + ["psql", "-U", "postgres", "-d", dbname, "-f", insert_script], + stdout=stdout, + stderr=stderr, + ) ############################################ - print('Setting up access privileges') + print("Setting up access privileges") ############################################ from TEKDB.models import Users + users = Users.objects.all() for user in users: user.set_password(user.password) - if user.accesslevel.accesslevel == 'Administrator': + if user.accesslevel.accesslevel == "Administrator": user.is_superuser = True user.is_staff = True - if user.accesslevel.accesslevel == 'Editor': + if user.accesslevel.accesslevel == "Editor": user.is_staff = True user.save() - def set_auto_pk_initial_values(self,import_output,import_error,dbname,update_script): + def set_auto_pk_initial_values( + self, import_output, import_error, dbname, update_script + ): ############################################ print("Resetting AutoIncrement Values") ############################################ from subprocess import call - stdout = open(import_output, 'ab') - stderr = open(import_error, 'ab') - call(['psql', '-U', 'postgres', '-d', dbname, '-f', update_script], stdout=stdout, stderr=stderr) + + stdout = open(import_output, "ab") + stderr = open(import_error, "ab") + call( + ["psql", "-U", "postgres", "-d", dbname, "-f", update_script], + stdout=stdout, + stderr=stderr, + ) def handle(self, *args, **options): import ipdb + ipdb.set_trace() # # Running this will delete your database. If you are okay with this, press 'c' and enter. If not, press 'q' and enter try: - revert = os.path.join(MANAGE_DIR, options['revert'][0]) + revert = os.path.join(MANAGE_DIR, options["revert"][0]) # noqa: F405 except Exception: revert = False FILE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - MANAGE_DIR = os.path.normpath(os.path.join(FILE_DIR,os.pardir,os.pardir)) - infile = os.path.normpath(os.path.join(MANAGE_DIR, options['infile'][0])) - insert_script = os.path.join(MANAGE_DIR, 'scripts','insert.sql') - update_script = os.path.join(MANAGE_DIR, 'scripts','update_sequences.sql') - import_output = os.path.join(MANAGE_DIR, 'scripts','import_output.txt') - import_error = os.path.join(MANAGE_DIR, 'scripts','import_output.txt') - manage_py = os.path.join(MANAGE_DIR, 'manage.py') + MANAGE_DIR = os.path.normpath(os.path.join(FILE_DIR, os.pardir, os.pardir)) + infile = os.path.normpath(os.path.join(MANAGE_DIR, options["infile"][0])) + insert_script = os.path.join(MANAGE_DIR, "scripts", "insert.sql") + update_script = os.path.join(MANAGE_DIR, "scripts", "update_sequences.sql") + import_output = os.path.join(MANAGE_DIR, "scripts", "import_output.txt") + import_error = os.path.join(MANAGE_DIR, "scripts", "import_output.txt") + manage_py = os.path.join(MANAGE_DIR, "manage.py") if not os.path.exists(infile): - print('File not found: %s' % infile) + print("File not found: %s" % infile) quit() if revert: @@ -425,21 +467,27 @@ def handle(self, *args, **options): self.delete_old_migrations(MANAGE_DIR) try: from TEKDB.settings import DATABASES - dbname = DATABASES['default']['NAME'] + + dbname = DATABASES["default"]["NAME"] except Exception: - dbname = 'tekdb' - print('Failed to set DB name from Local Settings!') - print('Enter c to contine, or type your desired dbname as `dbname = _____` hit enter, then c, then enter again.') + dbname = "tekdb" + print("Failed to set DB name from Local Settings!") + print( + "Enter c to contine, or type your desired dbname as `dbname = _____` hit enter, then c, then enter again." + ) import ipdb + ipdb.set_trace() self.rebuild_db(dbname, manage_py) insert_dict = self.create_sql_dict(infile) - self.create_insert_script(insert_script,insert_dict) + self.create_insert_script(insert_script, insert_dict) - self.import_sql_data(import_output,import_error,dbname,insert_script) + self.import_sql_data(import_output, import_error, dbname, insert_script) - self.set_auto_pk_initial_values(import_output,import_error,dbname,update_script) + self.set_auto_pk_initial_values( + import_output, import_error, dbname, update_script + ) ############################################ print("Import Complete") ############################################ diff --git a/TEKDB/TEKDB/migrations/0006_trigram_unaccent_extensions.py b/TEKDB/TEKDB/migrations/0006_trigram_unaccent_extensions.py index bc038e67..8161883f 100644 --- a/TEKDB/TEKDB/migrations/0006_trigram_unaccent_extensions.py +++ b/TEKDB/TEKDB/migrations/0006_trigram_unaccent_extensions.py @@ -1,5 +1,5 @@ from django.contrib.postgres.operations import TrigramExtension, UnaccentExtension -from django.db import migrations, models +from django.db import migrations class Migration(migrations.Migration): diff --git a/TEKDB/TEKDB/models.py b/TEKDB/TEKDB/models.py index 1f76ceae..a4b0e481 100644 --- a/TEKDB/TEKDB/models.py +++ b/TEKDB/TEKDB/models.py @@ -11,19 +11,26 @@ from django.db.models.functions import Greatest from django.db.models.signals import post_delete from django.dispatch import receiver -from django.contrib.auth.models import AbstractUser -from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector, TrigramSimilarity +from django.contrib.auth.models import AbstractUser, Group +from django.contrib.postgres.search import ( + SearchQuery, + SearchRank, + SearchVector, + TrigramSimilarity, +) from django.utils.translation import gettext_lazy as _ from django.utils import timezone from django.conf import settings from django.contrib.gis.db.models import GeometryField from tinymce.models import HTMLField + # from moderation.db import ModeratedModel import os # * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table MANAGED = True + def run_keyword_search(model, keyword, fields, fk_fields, weight_lookup, sort_field): # model -> the model calling this function # keyword -> [str] your search string -- can be multiple words @@ -32,9 +39,9 @@ def run_keyword_search(model, keyword, fields, fk_fields, weight_lookup, sort_fi # fk_fields can search any models with a fk for current model as well! # weight_lookup -> [dict] lookup to get relative ['A','B','C','D'] weights for scoring search results. - if keyword == '': + if keyword == "": return model.objects.all() - + similarities = [] vector = False similarity = False @@ -46,8 +53,10 @@ def run_keyword_search(model, keyword, fields, fk_fields, weight_lookup, sort_fi vector += SearchVector(val, weight=weight_lookup[val]) for val in fk_fields: - relationship_name = '__'.join(val) - similarities.append(TrigramSimilarity(relationship_name, keyword, weight=weight_lookup[val[0]])) + relationship_name = "__".join(val) + similarities.append( + TrigramSimilarity(relationship_name, keyword, weight=weight_lookup[val[0]]) + ) if not vector: vector = SearchVector(relationship_name, weight=weight_lookup[val[0]]) else: @@ -63,12 +72,13 @@ def run_keyword_search(model, keyword, fields, fk_fields, weight_lookup, sort_fi try: from TEKDB.context_processors import search_settings + search_settings = search_settings() - min_search_rank = search_settings['MIN_SEARCH_RANK'] - min_search_similarity = search_settings['MIN_SEARCH_SIMILARITY'] + min_search_rank = search_settings["MIN_SEARCH_RANK"] + min_search_similarity = search_settings["MIN_SEARCH_SIMILARITY"] except Exception as e: print(e) - pass + pass if len(similarities) > 1: similarity = Greatest(*similarities) @@ -77,27 +87,29 @@ def run_keyword_search(model, keyword, fields, fk_fields, weight_lookup, sort_fi else: return model.objects.none() - results = model.objects.annotate( - # search=vector, - rank=SearchRank(vector,query), - similarity=similarity - ).filter( - # Q(search__icontains=keyword) | # for some reason 'search=' in Q lose icontains abilities - # Q(search=keyword) | # for some reason __icontains paired w/ Q misses perfect matches - Q(rank__gte=min_search_rank) | - Q(similarity__gte=min_search_similarity) - ).order_by( - '-rank', - '-similarity', - sort_field - ).distinct() + results = ( + model.objects.annotate( + # search=vector, + rank=SearchRank(vector, query), + similarity=similarity, + ) + .filter( + # Q(search__icontains=keyword) | # for some reason 'search=' in Q lose icontains abilities + # Q(search=keyword) | # for some reason __icontains paired w/ Q misses perfect matches + Q(rank__gte=min_search_rank) | Q(similarity__gte=min_search_similarity) + ) + .order_by("-rank", "-similarity", sort_field) + .distinct() + ) return results + class ModeratedModel(models.Model): class Meta: abstract = True + class DefaultModeratedModel(models.Model): class Moderator: auto_approve_for_staff = not settings.MODERATE_STAFF @@ -109,18 +121,20 @@ class Moderator: class Meta: abstract = True + class DefaultModel(models.Model): """ An abstract base model that provides custom behavior for saving instances. - + This class overrides the `save` method to handle `IntegrityError` exceptions caused by duplicate key violations. If such an error occurs, it updates the database sequence for the primary key to ensure consistency and retries the save. - + Usage: - Inherit from this class to add the custom save behavior to your model. - Ensure that your model has a primary key field and a corresponding database sequence. """ + class Meta: abstract = True @@ -129,17 +143,21 @@ def save(self, *args, **kwargs): with transaction.atomic(): super(DefaultModel, self).save(*args, **kwargs) except IntegrityError as e: - if 'duplicate key value violates unique constraint' in str(e): + if "duplicate key value violates unique constraint" in str(e): # print("Duplicate key error: {}".format(e)) model = type(self) manager = model.objects # Formerly separate function 'update_model_sequence' - MAX_MODEL_PK = manager.all().order_by('pk').last().pk + MAX_MODEL_PK = manager.all().order_by("pk").last().pk DB_TABLE = model._meta.db_table PK_FIELD = model._meta.pk.name SEQUENCE_NAME = '"{}_{}_seq"'.format(DB_TABLE, PK_FIELD) with connection.cursor() as cursor: - cursor.execute("SELECT setval('{}', {}, true);".format(SEQUENCE_NAME, MAX_MODEL_PK)) + cursor.execute( + "SELECT setval('{}', {}, true);".format( + SEQUENCE_NAME, MAX_MODEL_PK + ) + ) with transaction.atomic(): super(DefaultModel, self).save(*args, **kwargs) else: @@ -148,7 +166,7 @@ def save(self, *args, **kwargs): class Record(DefaultModel, DefaultModeratedModel): def format_data(self, data_set, fk_field_id, ignore_columns=[]): - columns = ['id'] + columns = ["id"] rows = [] model = data_set.model model_name = model._meta.model_name @@ -163,29 +181,30 @@ def format_data(self, data_set, fk_field_id, ignore_columns=[]): else: model_instance = data_set.all()[0] if model_instance: - columns = columns + [field['key'] for field in model_instance.data()] + columns = columns + [field["key"] for field in model_instance.data()] for ignore_column in ignore_columns: try: columns.pop(columns.index(ignore_column)) - except: + except Exception: pass for item in data_set: row = [item.pk] for column in columns: for field in item.data(): - if field['key'] == column: - row.append(field['value']) + if field["key"] == column: + row.append(field["value"]) break rows.append(row) return { # 'object': self, - 'columns': columns, - 'rows': rows, - 'module': module, - 'model': model_name, - 'id_field': id_field, - 'fk_field_id': fk_field_id, + "columns": columns, + "rows": rows, + "module": module, + "model": model_name, + "id_field": id_field, + "fk_field_id": fk_field_id, } + def get_related_objects(self, object_id): # For each record with external relationships: # 1. get the relationship sets () @@ -198,39 +217,97 @@ def get_related_objects(self, object_id): class Meta: abstract = True + class Reviewable(models.Model): - needsReview = models.BooleanField(db_column='needsreview', default=True, verbose_name="Needs Review") - researchComments = models.TextField(db_column='researchcomments', blank=True, null=True, default=None, verbose_name="Research Comments") + needsReview = models.BooleanField( + db_column="needsreview", default=True, verbose_name="Needs Review" + ) + researchComments = models.TextField( + db_column="researchcomments", + blank=True, + null=True, + default=None, + verbose_name="Research Comments", + ) class Meta: abstract = True + class Queryable(models.Model): - enteredbyname = models.CharField(db_column='enteredbyname', max_length=25, blank=True, null=True, verbose_name='entered by name') - enteredbytribe = models.CharField(db_column='enteredbytribe', max_length=100, blank=True, null=True, verbose_name='entered by tribe') - enteredbytitle = models.CharField(db_column='enteredbytitle', max_length=100, blank=True, null=True, verbose_name='entered by title') - enteredbydate = models.DateTimeField(db_column='enteredbydate', blank=True, null=True, auto_now_add=True, verbose_name='entered by date') - modifiedbyname = models.CharField(db_column='modifiedbyname', max_length=25, blank=True, null=True, verbose_name='modified by name') - modifiedbytitle = models.CharField(db_column='modifiedbytitle', max_length=100, blank=True, null=True, verbose_name='modified by title') - modifiedbytribe = models.CharField(db_column='modifiedbytribe', max_length=100, blank=True, null=True, verbose_name='modified by tribe') - modifiedbydate = models.DateTimeField(db_column='modifiedbydate', blank=True, null=True, auto_now=True, verbose_name='modified by date') + enteredbyname = models.CharField( + db_column="enteredbyname", + max_length=25, + blank=True, + null=True, + verbose_name="entered by name", + ) + enteredbytribe = models.CharField( + db_column="enteredbytribe", + max_length=100, + blank=True, + null=True, + verbose_name="entered by tribe", + ) + enteredbytitle = models.CharField( + db_column="enteredbytitle", + max_length=100, + blank=True, + null=True, + verbose_name="entered by title", + ) + enteredbydate = models.DateTimeField( + db_column="enteredbydate", + blank=True, + null=True, + auto_now_add=True, + verbose_name="entered by date", + ) + modifiedbyname = models.CharField( + db_column="modifiedbyname", + max_length=25, + blank=True, + null=True, + verbose_name="modified by name", + ) + modifiedbytitle = models.CharField( + db_column="modifiedbytitle", + max_length=100, + blank=True, + null=True, + verbose_name="modified by title", + ) + modifiedbytribe = models.CharField( + db_column="modifiedbytribe", + max_length=100, + blank=True, + null=True, + verbose_name="modified by tribe", + ) + modifiedbydate = models.DateTimeField( + db_column="modifiedbydate", + blank=True, + null=True, + auto_now=True, + verbose_name="modified by date", + ) class Meta: abstract = True - #Actually a dict, not true JSON. + # Actually a dict, not true JSON. def get_query_json(self): return { - 'name': str(self), - 'image': self.image(), - 'subtitle': self.subtitle(), - 'data': self.data(), - 'link': self.link(), - 'issimplerelationship': self.is_simple_relationship(), - 'enteredbyname': self.enteredbyname, - 'enteredbydate': self.enteredbydate, - 'modifiedbyname': self.modifiedbyname, - 'modifiedbydate': self.modifiedbydate, + "name": str(self), + "image": self.image(), + "subtitle": self.subtitle(), + "data": self.data(), + "link": self.link(), + "issimplerelationship": self.is_simple_relationship(), + "enteredbyname": self.enteredbyname, + "enteredbydate": self.enteredbydate, + "modifiedbyname": self.modifiedbyname, + "modifiedbydate": self.modifiedbydate, } def map(self, srid=None): @@ -250,26 +327,26 @@ def get_record_dict(self, user, srid=3857): data = self.data() restricted = False return { - 'name': str(self), - 'image': self.image(), - 'subtitle': self.subtitle(), - 'data': data, - 'relationships': self.relationships(), - 'map': self.map(srid), - 'media': self.media(), + "name": str(self), + "image": self.image(), + "subtitle": self.subtitle(), + "data": data, + "relationships": self.relationships(), + "map": self.map(srid), + "media": self.media(), # 'link': self.link(), - 'enteredbyname': self.enteredbyname, - 'enteredbydate': self.enteredbydate, - 'modifiedbyname': self.modifiedbyname, - 'modifiedbydate': self.modifiedbydate, - 'restricted': restricted, + "enteredbyname": self.enteredbyname, + "enteredbydate": self.enteredbydate, + "modifiedbyname": self.modifiedbyname, + "modifiedbydate": self.modifiedbydate, + "restricted": restricted, } def media(self): return False def save(self, *args, **kwargs): - #TODO: set entered/modified by info now + # TODO: set entered/modified by info now super(Queryable, self).save(*args, **kwargs) def is_simple_relationship(self): @@ -278,8 +355,8 @@ def is_simple_relationship(self): def get_relationship_json(self, req_model): return self.get_query_json() -class SimpleRelationship(DefaultModel, Queryable): +class SimpleRelationship(DefaultModel, Queryable): class Meta: abstract = True @@ -293,195 +370,302 @@ def get_relationship_json(self, req_model_type): relationship_model = self.get_relationship_model(req_model_type) rel_model_json = relationship_model.get_query_json() return { - 'name': rel_model_json['name'], - 'link': rel_model_json['link'], - 'issimplerelationship': self.is_simple_relationship(), - 'data': { - 'description': self.relationshipdescription, - 'pages': self.pages, + "name": rel_model_json["name"], + "link": rel_model_json["link"], + "issimplerelationship": self.is_simple_relationship(), + "data": { + "description": self.relationshipdescription, + "pages": self.pages, }, } -class Lookup(DefaultModel, DefaultModeratedModel, ModeratedModel): +class Lookup(DefaultModel, DefaultModeratedModel, ModeratedModel): class Meta: abstract = True + class LookupPlanningUnit(Lookup): - planningunitid = models.AutoField(db_column='planningunitid', primary_key=True) - planningunitname = models.CharField(db_column='planningunitname', max_length=100, blank=True, null=True, verbose_name='planning unit') + planningunitid = models.AutoField(db_column="planningunitid", primary_key=True) + planningunitname = models.CharField( + db_column="planningunitname", + max_length=100, + blank=True, + null=True, + verbose_name="planning unit", + ) class Meta: - ordering = ['planningunitname'] + ordering = ["planningunitname"] managed = MANAGED - ordering = ['planningunitname'] - db_table = 'lookupplanningunit' - app_label="Lookup" - verbose_name="planning unit" - verbose_name_plural="planning units" + ordering = ["planningunitname"] + db_table = "lookupplanningunit" + app_label = "Lookup" + verbose_name = "planning unit" + verbose_name_plural = "planning units" def __unicode__(self): - return unicode("%s" % (self.planningunitname)) + return unicode("%s" % (self.planningunitname)) # noqa: F821 def __str__(self): - return self.planningunitname or '' + return self.planningunitname or "" + class LookupTribe(Lookup): - id = models.AutoField(db_column='id', primary_key=True) - tribeunit = models.CharField(db_column='tribeunit', max_length=50, blank=True, null=True, verbose_name='tribe subunit') - tribe = models.CharField(db_column='tribe', max_length=255, blank=True, null=True, verbose_name='tribe') - federaltribe = models.CharField(db_column='federaltribe', max_length=255, blank=True, null=True, verbose_name='tribal government') + id = models.AutoField(db_column="id", primary_key=True) + tribeunit = models.CharField( + db_column="tribeunit", + max_length=50, + blank=True, + null=True, + verbose_name="tribe subunit", + ) + tribe = models.CharField( + db_column="tribe", max_length=255, blank=True, null=True, verbose_name="tribe" + ) + federaltribe = models.CharField( + db_column="federaltribe", + max_length=255, + blank=True, + null=True, + verbose_name="tribal government", + ) class Meta: managed = MANAGED - ordering = ['tribe'] - db_table = 'lookuptribe' - app_label="Lookup" - verbose_name="tribe" - verbose_name_plural="tribes" + ordering = ["tribe"] + db_table = "lookuptribe" + app_label = "Lookup" + verbose_name = "tribe" + verbose_name_plural = "tribes" def keyword_search(keyword): return LookupTribe.objects.filter( - Q(tribeunit__icontains=keyword) | - Q(tribe__icontains=keyword) | - Q(federaltribe__icontains=keyword) + Q(tribeunit__icontains=keyword) + | Q(tribe__icontains=keyword) + | Q(federaltribe__icontains=keyword) ) def __unicode__(self): - return unicode("%s: %s, %s" % (self.tribe, self.tribeunit, self.federaltribe)) + return unicode("%s: %s, %s" % (self.tribe, self.tribeunit, self.federaltribe)) # noqa: F821 def __str__(self): - return "%s: %s, %s" % (self.tribe, self.tribeunit, self.federaltribe) or '' + return "%s: %s, %s" % (self.tribe, self.tribeunit, self.federaltribe) or "" def data(self): return [ - {'key':'tribe', 'value': self.tribe}, - {'key':'tribe subunit', 'value': self.tribeunit}, - {'key':'tribal government', 'value': self.federaltribe} + {"key": "tribe", "value": self.tribe}, + {"key": "tribe subunit", "value": self.tribeunit}, + {"key": "tribal government", "value": self.federaltribe}, ] def get_response_format(self): - type = 'tribes' + type = "tribes" category_name = "Tribe" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': None, - 'description': None, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": None, + "description": None, + "link": "/explore/%s/%d" % (type, self.pk), } + class LookupHabitat(Lookup): - id = models.AutoField(db_column='id', primary_key=True) - habitat = models.CharField(db_column='habitat', max_length=100) + id = models.AutoField(db_column="id", primary_key=True) + habitat = models.CharField(db_column="habitat", max_length=100) class Meta: managed = MANAGED - ordering = ['habitat'] - db_table = 'lookuphabitat' - app_label="Lookup" - verbose_name="habitat" - verbose_name_plural="habitats" + ordering = ["habitat"] + db_table = "lookuphabitat" + app_label = "Lookup" + verbose_name = "habitat" + verbose_name_plural = "habitats" def __unicode__(self): - return unicode('%s' % (self.habitat)) + return unicode("%s" % (self.habitat)) # noqa: F821 def __str__(self): - return self.habitat or '' + return self.habitat or "" + class Places(Reviewable, Queryable, Record, ModeratedModel): - placeid = models.AutoField(db_column='placeid', primary_key=True) + placeid = models.AutoField(db_column="placeid", primary_key=True) # PlaceID - indigenousplacename = models.CharField(db_column='indigenousplacename', max_length=255, blank=True, null=True, verbose_name='indigenous name') - indigenousplacenamemeaning = models.TextField(db_column='indigenousplacenamemeaning', blank=True, null=True, verbose_name='english translation') - englishplacename = models.CharField(db_column='englishplacename', max_length=255, blank=True, null=True, verbose_name='english name') + indigenousplacename = models.CharField( + db_column="indigenousplacename", + max_length=255, + blank=True, + null=True, + verbose_name="indigenous name", + ) + indigenousplacenamemeaning = models.TextField( + db_column="indigenousplacenamemeaning", + blank=True, + null=True, + verbose_name="english translation", + ) + englishplacename = models.CharField( + db_column="englishplacename", + max_length=255, + blank=True, + null=True, + verbose_name="english name", + ) # PlaceLabel = models.CharField(max_length=255, blank=True, null=True, verbose_name='Place Label') - planningunitid = models.ForeignKey(LookupPlanningUnit, db_column='planningunitid', blank=True, null=True, verbose_name='planning unit', default=None, on_delete=models.SET_DEFAULT) - primaryhabitat = models.ForeignKey(LookupHabitat, db_column='primaryhabitat', max_length=100, blank=True, null=True, verbose_name='primary habitat', default=None, on_delete=models.SET_DEFAULT) + planningunitid = models.ForeignKey( + LookupPlanningUnit, + db_column="planningunitid", + blank=True, + null=True, + verbose_name="planning unit", + default=None, + on_delete=models.SET_DEFAULT, + ) + primaryhabitat = models.ForeignKey( + LookupHabitat, + db_column="primaryhabitat", + max_length=100, + blank=True, + null=True, + verbose_name="primary habitat", + default=None, + on_delete=models.SET_DEFAULT, + ) # FeatType = models.CharField(choices=FEATURE_TYPE_CHOICES) - tribeid = models.ForeignKey(LookupTribe, db_column='tribeid', blank=True, null=True, verbose_name='tribe', default=True, on_delete=models.SET_DEFAULT) - islocked = models.BooleanField(db_column='islocked', default=False, verbose_name='locked?') + tribeid = models.ForeignKey( + LookupTribe, + db_column="tribeid", + blank=True, + null=True, + verbose_name="tribe", + default=True, + on_delete=models.SET_DEFAULT, + ) + islocked = models.BooleanField( + db_column="islocked", default=False, verbose_name="locked?" + ) ### Updated Geometry Fields ### objects = GeoManager() geometry = GeometryField( - srid=3857, - null=True, blank=True, - verbose_name="Place Geometry", - default=None - ) - Source = models.CharField(db_column='source', max_length=255, blank=True, null=True, default=None, verbose_name='source') - DigitizedBy = models.CharField(db_column='digitizedby', max_length=255, blank=True, null=True, default=None, verbose_name='digitized by') - DigitizedDate = models.DateTimeField(db_column='digitizeddate', blank=True, null=True, auto_now_add=False, default=None, verbose_name='digitized date') + srid=3857, null=True, blank=True, verbose_name="Place Geometry", default=None + ) + Source = models.CharField( + db_column="source", + max_length=255, + blank=True, + null=True, + default=None, + verbose_name="source", + ) + DigitizedBy = models.CharField( + db_column="digitizedby", + max_length=255, + blank=True, + null=True, + default=None, + verbose_name="digitized by", + ) + DigitizedDate = models.DateTimeField( + db_column="digitizeddate", + blank=True, + null=True, + auto_now_add=False, + default=None, + verbose_name="digitized date", + ) # PlaceDescription # SHAPE_Length # SHAPE_Area class Meta: managed = MANAGED - db_table = 'places' - verbose_name = 'Place' - verbose_name_plural = 'Places' + db_table = "places" + verbose_name = "Place" + verbose_name_plural = "Places" def keyword_search( - keyword, # string - fields=['indigenousplacename','englishplacename','indigenousplacenamemeaning','Source','DigitizedBy'], # fields to search - fk_fields=[ - ('planningunitid','planningunitname'), - ('primaryhabitat','habitat'), - ('tribeid','tribe'), - ('placealtindigenousname','altindigenousname') - ] # fields to search for fk objects - ): - + keyword, # string + fields=[ + "indigenousplacename", + "englishplacename", + "indigenousplacenamemeaning", + "Source", + "DigitizedBy", + ], # fields to search + fk_fields=[ + ("planningunitid", "planningunitname"), + ("primaryhabitat", "habitat"), + ("tribeid", "tribe"), + ("placealtindigenousname", "altindigenousname"), + ], # fields to search for fk objects + ): weight_lookup = { - 'indigenousplacename': 'A', - 'englishplacename': 'A', - 'indigenousplacenamemeaning': 'A', - 'Source': 'C', - 'DigitizedBy': 'C', - 'planningunitid': 'B', - 'primaryhabitat': 'B', - 'tribeid': 'B', - 'placealtindigenousname': 'A' + "indigenousplacename": "A", + "englishplacename": "A", + "indigenousplacenamemeaning": "A", + "Source": "C", + "DigitizedBy": "C", + "planningunitid": "B", + "primaryhabitat": "B", + "tribeid": "B", + "placealtindigenousname": "A", } - sort_field = 'indigenousplacename' - - return run_keyword_search(Places, keyword, fields, fk_fields, weight_lookup, sort_field) + sort_field = "indigenousplacename" + return run_keyword_search( + Places, keyword, fields, fk_fields, weight_lookup, sort_field + ) def image(self): - return settings.RECORD_ICONS['place'] + return settings.RECORD_ICONS["place"] def subtitle(self): return self.indigenousplacenamemeaning def data(self): return [ - {'key':'indigenous place name', 'value': self.indigenousplacename}, - {'key':'english place name', 'value': self.englishplacename}, - {'key':'indigenous place name meaning', 'value': self.indigenousplacenamemeaning}, - {'key':'planning unit', 'value': str(self.planningunitid)}, - {'key':'primary habitat', 'value': str(self.primaryhabitat)}, - {'key':'tribe', 'value': str(self.tribeid)} + {"key": "indigenous place name", "value": self.indigenousplacename}, + {"key": "english place name", "value": self.englishplacename}, + { + "key": "indigenous place name meaning", + "value": self.indigenousplacenamemeaning, + }, + {"key": "planning unit", "value": str(self.planningunitid)}, + {"key": "primary habitat", "value": str(self.primaryhabitat)}, + {"key": "tribe", "value": str(self.tribeid)}, ] def relationships(self): relationship_list = [] - alt_names = [ainame.get_query_json() for ainame in self.placealtindigenousname_set.all()] + alt_names = [ + ainame.get_query_json() for ainame in self.placealtindigenousname_set.all() + ] if len(alt_names) > 0: - relationship_list.append({'key':'Alternate Names', 'value':alt_names}) - resources = [res.get_query_json() for res in self.placesresourceevents_set.all()] + relationship_list.append({"key": "Alternate Names", "value": alt_names}) + resources = [ + res.get_query_json() for res in self.placesresourceevents_set.all() + ] if len(resources) > 0: - relationship_list.append({'key':'Place-Resource Events', 'value':resources}) - media = [media.get_relationship_json(type(self)) for media in self.placesmediaevents_set.all()] + relationship_list.append( + {"key": "Place-Resource Events", "value": resources} + ) + media = [ + media.get_relationship_json(type(self)) + for media in self.placesmediaevents_set.all() + ] if len(media) > 0: - relationship_list.append({'key':'Media', 'value':media}) - sources = [citation.get_relationship_json(type(self)) for citation in self.placescitationevents_set.all()] + relationship_list.append({"key": "Media", "value": media}) + sources = [ + citation.get_relationship_json(type(self)) + for citation in self.placescitationevents_set.all() + ] if len(sources) > 0: - relationship_list.append({'key':'Bibliographic Sources', 'value':sources}) + relationship_list.append({"key": "Bibliographic Sources", "value": sources}) return relationship_list @@ -494,25 +678,25 @@ def map(self, srid=3857): return geom def link(self): - return '/explore/places/%d/' % self.pk + return "/explore/places/%d/" % self.pk def get_response_format(self): - type = 'places' - category_name = 'Place' + type = "places" + category_name = "Place" try: feature = self.geometry.json - except AttributeError as e: + except AttributeError: feature = None return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'map_pin': settings.RECORD_ICONS['map_pin'], - 'description': self.indigenousplacenamemeaning, - 'link': '/explore/%s/%d' % (type, self.pk), - 'feature': feature + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "map_pin": settings.RECORD_ICONS["map_pin"], + "description": self.indigenousplacenamemeaning, + "link": "/explore/%s/%d" % (type, self.pk), + "feature": feature, } # def get_record_dict(self, user, srid=3857): @@ -528,20 +712,22 @@ def get_related_objects(self, object_id): related_citations = self.placescitationevents_set.all() return [ { - 'title': 'Alternate Names', - 'data': self.format_data(alt_names, 'placeid', ['place']) + "title": "Alternate Names", + "data": self.format_data(alt_names, "placeid", ["place"]), }, { - 'title': 'Resource Relationships', - 'data': self.format_data(related_resources, 'placeid', ['place','excerpt','months']) + "title": "Resource Relationships", + "data": self.format_data( + related_resources, "placeid", ["place", "excerpt", "months"] + ), }, { - 'title': 'Media Relationships', - 'data': self.format_data(related_media, 'placeid', ['place']) + "title": "Media Relationships", + "data": self.format_data(related_media, "placeid", ["place"]), }, { - 'title': 'Citation Relationships', - 'data': self.format_data(related_citations, 'placeid', ['place']) + "title": "Citation Relationships", + "data": self.format_data(related_citations, "placeid", ["place"]), }, ] @@ -550,13 +736,13 @@ def __unicode__(self): english = self.englishplacename or "" if indigenous and english: - return u'%s (%s)' % (indigenous, english) + return u"%s (%s)" % (indigenous, english) # fmt: off elif indigenous: - return unicode(indigenous) + return unicode(indigenous) # noqa: F821 elif english: - return unicode(english) + return unicode(english) # noqa: F821 else: - return u'No Name Given' + return u"No Name Given" # fmt: off def __str__(self): indigenous = self.indigenousplacename or "" @@ -571,67 +757,102 @@ def __str__(self): else: return "No Name Given" + class LookupResourceGroup(Lookup): - id = models.AutoField(db_column='id', primary_key=True) - resourceclassificationgroup = models.CharField(db_column='resourceclassificationgroup', max_length=255, verbose_name='broad species group') + id = models.AutoField(db_column="id", primary_key=True) + resourceclassificationgroup = models.CharField( + db_column="resourceclassificationgroup", + max_length=255, + verbose_name="broad species group", + ) class Meta: managed = MANAGED - ordering = ['resourceclassificationgroup'] - db_table = 'lookupresourcegroup' - app_label = 'Lookup' - verbose_name="resource group" - verbose_name_plural="resource groups" + ordering = ["resourceclassificationgroup"] + db_table = "lookupresourcegroup" + app_label = "Lookup" + verbose_name = "resource group" + verbose_name_plural = "resource groups" def __unicode__(self): - return unicode('%s' % (self.resourceclassificationgroup)) + return unicode("%s" % (self.resourceclassificationgroup)) # noqa: F821 def __str__(self): - return self.resourceclassificationgroup or '' + return self.resourceclassificationgroup or "" + class Resources(Reviewable, Queryable, Record, ModeratedModel): - resourceid = models.AutoField(db_column='resourceid', primary_key=True) - commonname = models.CharField(db_column='commonname', max_length=255, blank=True, null=True, unique=True, verbose_name='common name') - indigenousname = models.CharField(db_column='indigenousname', max_length=255, blank=True, null=True, verbose_name='indigenous name') - genus = models.CharField(db_column='genus', max_length=255, blank=True, null=True, verbose_name='genus') - species = models.CharField(db_column='species', max_length=255, blank=True, null=True) - specific = models.BooleanField(db_column='specific', default=False) - resourceclassificationgroup = models.ForeignKey(LookupResourceGroup, db_column='resourceclassificationgroup', max_length=255, blank=True, null=True, verbose_name='broad species group', default=None, on_delete=models.SET_DEFAULT) - islocked = models.BooleanField(db_column='islocked', default=False, verbose_name='locked?') + resourceid = models.AutoField(db_column="resourceid", primary_key=True) + commonname = models.CharField( + db_column="commonname", + max_length=255, + blank=True, + null=True, + unique=True, + verbose_name="common name", + ) + indigenousname = models.CharField( + db_column="indigenousname", + max_length=255, + blank=True, + null=True, + verbose_name="indigenous name", + ) + genus = models.CharField( + db_column="genus", max_length=255, blank=True, null=True, verbose_name="genus" + ) + species = models.CharField( + db_column="species", max_length=255, blank=True, null=True + ) + specific = models.BooleanField(db_column="specific", default=False) + resourceclassificationgroup = models.ForeignKey( + LookupResourceGroup, + db_column="resourceclassificationgroup", + max_length=255, + blank=True, + null=True, + verbose_name="broad species group", + default=None, + on_delete=models.SET_DEFAULT, + ) + islocked = models.BooleanField( + db_column="islocked", default=False, verbose_name="locked?" + ) class Meta: managed = MANAGED - db_table = 'resources' - verbose_name = 'Resource' - verbose_name_plural = 'Resources' + db_table = "resources" + verbose_name = "Resource" + verbose_name_plural = "Resources" def __unicode__(self): - return unicode('%s' % (self.commonname)) + return unicode("%s" % (self.commonname)) # noqa: F821 def __str__(self): - return self.commonname or '' + return self.commonname or "" def keyword_search( - keyword, # string - fields=['commonname','indigenousname','genus','species'], # fields to search - fk_fields=[ - ('resourceclassificationgroup','resourceclassificationgroup'), - ('resourcealtindigenousname', 'altindigenousname') - ] # fields to search for fk objects - ): - + keyword, # string + fields=["commonname", "indigenousname", "genus", "species"], # fields to search + fk_fields=[ + ("resourceclassificationgroup", "resourceclassificationgroup"), + ("resourcealtindigenousname", "altindigenousname"), + ], # fields to search for fk objects + ): weight_lookup = { - 'commonname': 'A', - 'indigenousname': 'A', - 'genus': 'C', - 'species': 'C', - 'resourceclassificationgroup': 'B', - 'resourcealtindigenousname': 'A' + "commonname": "A", + "indigenousname": "A", + "genus": "C", + "species": "C", + "resourceclassificationgroup": "B", + "resourcealtindigenousname": "A", } - sort_field = 'commonname' + sort_field = "commonname" - return run_keyword_search(Resources, keyword, fields, fk_fields, weight_lookup, sort_field) + return run_keyword_search( + Resources, keyword, fields, fk_fields, weight_lookup, sort_field + ) ################################ # NEW APPROACH ################# ################################ @@ -666,58 +887,82 @@ def keyword_search( # ) def image(self): - return settings.RECORD_ICONS['resource'] + return settings.RECORD_ICONS["resource"] def subtitle(self): return self.species def relationships(self): relationship_list = [] - alternate_names = [altname.get_query_json() for altname in self.resourcealtindigenousname_set.all()] + alternate_names = [ + altname.get_query_json() + for altname in self.resourcealtindigenousname_set.all() + ] if len(alternate_names) > 0: - relationship_list.append({'key':'Alternate Names', 'value': alternate_names}) + relationship_list.append( + {"key": "Alternate Names", "value": alternate_names} + ) placeresources = self.placesresourceevents_set.all() placeresourceidlist = [x.pk for x in placeresources] - activities = [x.get_query_json() for x in ResourcesActivityEvents.objects.filter(placeresourceid__in=placeresourceidlist)] + activities = [ + x.get_query_json() + for x in ResourcesActivityEvents.objects.filter( + placeresourceid__in=placeresourceidlist + ) + ] if len(activities) > 0: - relationship_list.append({'key':'Activities', 'value': activities }) - media = [x.get_relationship_json(type(self)) for x in self.resourcesmediaevents_set.all()] + relationship_list.append({"key": "Activities", "value": activities}) + media = [ + x.get_relationship_json(type(self)) + for x in self.resourcesmediaevents_set.all() + ] if len(media) > 0: - relationship_list.append({'key':'Media', 'value':media }) - citations = [x.get_relationship_json(type(self)) for x in self.resourcescitationevents_set.all()] + relationship_list.append({"key": "Media", "value": media}) + citations = [ + x.get_relationship_json(type(self)) + for x in self.resourcescitationevents_set.all() + ] if len(citations) > 0: - relationship_list.append({'key':'Bibliographic Sources', 'value': citations}) + relationship_list.append( + {"key": "Bibliographic Sources", "value": citations} + ) places = [x.get_query_json() for x in placeresources] if len(places) > 0: - relationship_list.append({'key':'Place-Resource Events', 'value': places}) - resources = [x.get_relationship_json(type(self)) for x in ResourceResourceEvents.objects.filter(altresourceid=self)] + relationship_list.append({"key": "Place-Resource Events", "value": places}) + resources = [ + x.get_relationship_json(type(self)) + for x in ResourceResourceEvents.objects.filter(altresourceid=self) + ] if len(resources) > 0: - relationship_list.append({'key':'Resources', 'value': resources}) + relationship_list.append({"key": "Resources", "value": resources}) return relationship_list def link(self): - return '/explore/resources/%d/' % self.pk + return "/explore/resources/%d/" % self.pk def data(self): return [ - {'key':'name', 'value': self.commonname}, - {'key':'indigenous name', 'value': self.indigenousname}, - {'key':'genus', 'value': self.genus}, - {'key':'species', 'value': self.species}, - {'key':'broad species group', 'value': str(self.resourceclassificationgroup)} + {"key": "name", "value": self.commonname}, + {"key": "indigenous name", "value": self.indigenousname}, + {"key": "genus", "value": self.genus}, + {"key": "species", "value": self.species}, + { + "key": "broad species group", + "value": str(self.resourceclassificationgroup), + }, ] def get_response_format(self): - type = 'resources' - category_name = 'Resource' + type = "resources" + category_name = "Resource" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': self.indigenousname, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": self.indigenousname, + "link": "/explore/%s/%d" % (type, self.pk), } def get_related_objects(self, object_id): @@ -727,117 +972,193 @@ def get_related_objects(self, object_id): resource_events = ResourceResourceEvents.objects.filter(resourceid=self.pk) alt_names = self.resourcealtindigenousname_set.all() return [ - {'title': 'Media Relationships', 'data': self.format_data(media_events, 'resourceid', ['resource'])}, - {'title': 'Citation Relationships', 'data': self.format_data(citation_events, 'resourceid', ['resource'])}, - {'title': 'Place Relationships', 'data': self.format_data(place_events, 'resourceid', ['resource','months'])}, - {'title': 'Resource Relationships', 'data': self.format_data(resource_events, 'resourceid', ['resource a'])}, - {'title': 'Alternate Names', 'data': self.format_data(alt_names, 'resourceid', ['resource'])}, + { + "title": "Media Relationships", + "data": self.format_data(media_events, "resourceid", ["resource"]), + }, + { + "title": "Citation Relationships", + "data": self.format_data(citation_events, "resourceid", ["resource"]), + }, + { + "title": "Place Relationships", + "data": self.format_data( + place_events, "resourceid", ["resource", "months"] + ), + }, + { + "title": "Resource Relationships", + "data": self.format_data(resource_events, "resourceid", ["resource a"]), + }, + { + "title": "Alternate Names", + "data": self.format_data(alt_names, "resourceid", ["resource"]), + }, ] + class LookupPartUsed(Lookup): - id = models.AutoField(db_column='id', primary_key=True) - partused = models.CharField(db_column='partused', max_length=255, verbose_name='part used') + id = models.AutoField(db_column="id", primary_key=True) + partused = models.CharField( + db_column="partused", max_length=255, verbose_name="part used" + ) class Meta: managed = MANAGED - ordering = ['partused'] - db_table = 'lookuppartused' - app_label="Lookup" - verbose_name="part used" - verbose_name_plural="parts used" + ordering = ["partused"] + db_table = "lookuppartused" + app_label = "Lookup" + verbose_name = "part used" + verbose_name_plural = "parts used" def __unicode__(self): - return unicode('%s' % (self.partused)) + return unicode("%s" % (self.partused)) # noqa: F821 def __str__(self): - return self.partused or '' + return self.partused or "" + class LookupCustomaryUse(Lookup): - id = models.AutoField(db_column='id', primary_key=True) - usedfor = models.CharField(db_column='usedfor', max_length=255, verbose_name='used_for') + id = models.AutoField(db_column="id", primary_key=True) + usedfor = models.CharField( + db_column="usedfor", max_length=255, verbose_name="used_for" + ) class Meta: managed = MANAGED - ordering = ['usedfor'] - db_table = 'lookupcustomaryuse' - app_label="Lookup" - verbose_name="customary use" - verbose_name_plural="customary uses" + ordering = ["usedfor"] + db_table = "lookupcustomaryuse" + app_label = "Lookup" + verbose_name = "customary use" + verbose_name_plural = "customary uses" def __unicode__(self): - return unicode('%s' % (self.usedfor)) + return unicode("%s" % (self.usedfor)) # noqa: F821 def __str__(self): - return self.usedfor or '' + return self.usedfor or "" + class LookupSeason(Lookup): - id = models.AutoField(db_column='id', primary_key=True) - season = models.CharField(db_column='season', max_length=255) + id = models.AutoField(db_column="id", primary_key=True) + season = models.CharField(db_column="season", max_length=255) class Meta: managed = MANAGED - ordering = ['season'] - db_table = 'lookupseason' - app_label="Lookup" - verbose_name="season" - verbose_name_plural="seasons" + ordering = ["season"] + db_table = "lookupseason" + app_label = "Lookup" + verbose_name = "season" + verbose_name_plural = "seasons" def __unicode__(self): - return unicode('%s' % (self.season)) + return unicode("%s" % (self.season)) # noqa: F821 def __str__(self): - return self.season or '' + return self.season or "" + class LookupTiming(Lookup): - id = models.AutoField(db_column='id', primary_key=True) - timing = models.CharField(db_column='timing', max_length=255) + id = models.AutoField(db_column="id", primary_key=True) + timing = models.CharField(db_column="timing", max_length=255) class Meta: managed = MANAGED - ordering = ['timing'] - db_table = 'lookuptiming' - app_label="Lookup" - verbose_name="timing" - verbose_name_plural="timings" + ordering = ["timing"] + db_table = "lookuptiming" + app_label = "Lookup" + verbose_name = "timing" + verbose_name_plural = "timings" def __unicode__(self): - return unicode('%s' % (self.timing)) + return unicode("%s" % (self.timing)) # noqa: F821 def __str__(self): - return self.timing or '' + return self.timing or "" + -#Unsure why this is not a 'SimpleRelationship' +# Unsure why this is not a 'SimpleRelationship' class PlacesResourceEvents(DefaultModel, Reviewable, Queryable): - placeresourceid = models.AutoField(db_column='placeresourceid', primary_key=True) - placeid = models.ForeignKey(Places, db_column='placeid', verbose_name='place', on_delete=models.CASCADE) - resourceid = models.ForeignKey(Resources, db_column='resourceid', verbose_name='resource', on_delete=models.CASCADE) - relationshipdescription = HTMLField(db_column='relationshipdescription', blank=True, null=True, verbose_name='excerpt') - partused = models.ForeignKey(LookupPartUsed, db_column='partused', max_length=255, blank=True, null=True, verbose_name='part used', default=None, on_delete=models.SET_DEFAULT) - customaryuse = models.ForeignKey(LookupCustomaryUse, db_column='customaryuse', max_length=255, blank=True, null=True, verbose_name='customary use', default=None, on_delete=models.SET_DEFAULT) - barterresource = models.BooleanField(db_column='barterresource', verbose_name='barter resource?', default=False) - season = models.ForeignKey(LookupSeason, db_column='season', max_length=255, blank=True, null=True, default=None, on_delete=models.SET_DEFAULT) - timing = models.ForeignKey(LookupTiming, db_column='timing', max_length=255, blank=True, null=True, default=None, on_delete=models.SET_DEFAULT) - january = models.BooleanField(db_column='january', default=False) - february = models.BooleanField(db_column='february', default=False) - march = models.BooleanField(db_column='march', default=False) - april = models.BooleanField(db_column='april', default=False) - may = models.BooleanField(db_column='may', default=False) - june = models.BooleanField(db_column='june', default=False) - july = models.BooleanField(db_column='july', default=False) - august = models.BooleanField(db_column='august', default=False) - september = models.BooleanField(db_column='september', default=False) - october = models.BooleanField(db_column='october', default=False) - november = models.BooleanField(db_column='november', default=False) - december = models.BooleanField(db_column='december', default=False) - year = models.IntegerField(db_column='year', blank=True, null=True) - islocked = models.BooleanField(db_column='islocked', verbose_name='locked?', default=False) + placeresourceid = models.AutoField(db_column="placeresourceid", primary_key=True) + placeid = models.ForeignKey( + Places, db_column="placeid", verbose_name="place", on_delete=models.CASCADE + ) + resourceid = models.ForeignKey( + Resources, + db_column="resourceid", + verbose_name="resource", + on_delete=models.CASCADE, + ) + relationshipdescription = HTMLField( + db_column="relationshipdescription", + blank=True, + null=True, + verbose_name="excerpt", + ) + partused = models.ForeignKey( + LookupPartUsed, + db_column="partused", + max_length=255, + blank=True, + null=True, + verbose_name="part used", + default=None, + on_delete=models.SET_DEFAULT, + ) + customaryuse = models.ForeignKey( + LookupCustomaryUse, + db_column="customaryuse", + max_length=255, + blank=True, + null=True, + verbose_name="customary use", + default=None, + on_delete=models.SET_DEFAULT, + ) + barterresource = models.BooleanField( + db_column="barterresource", verbose_name="barter resource?", default=False + ) + season = models.ForeignKey( + LookupSeason, + db_column="season", + max_length=255, + blank=True, + null=True, + default=None, + on_delete=models.SET_DEFAULT, + ) + timing = models.ForeignKey( + LookupTiming, + db_column="timing", + max_length=255, + blank=True, + null=True, + default=None, + on_delete=models.SET_DEFAULT, + ) + january = models.BooleanField(db_column="january", default=False) + february = models.BooleanField(db_column="february", default=False) + march = models.BooleanField(db_column="march", default=False) + april = models.BooleanField(db_column="april", default=False) + may = models.BooleanField(db_column="may", default=False) + june = models.BooleanField(db_column="june", default=False) + july = models.BooleanField(db_column="july", default=False) + august = models.BooleanField(db_column="august", default=False) + september = models.BooleanField(db_column="september", default=False) + october = models.BooleanField(db_column="october", default=False) + november = models.BooleanField(db_column="november", default=False) + december = models.BooleanField(db_column="december", default=False) + year = models.IntegerField(db_column="year", blank=True, null=True) + islocked = models.BooleanField( + db_column="islocked", verbose_name="locked?", default=False + ) class Meta: managed = MANAGED - db_table = 'placesresourceevents' - app_label = 'Relationships' - verbose_name = 'Place - Resource' - verbose_name_plural = 'Places - Resources' + db_table = "placesresourceevents" + app_label = "Relationships" + verbose_name = "Place - Resource" + verbose_name_plural = "Places - Resources" def keyword_search(keyword): resource_qs = Resources.keyword_search(keyword) @@ -859,216 +1180,355 @@ def keyword_search(keyword): timing_loi = [timing.pk for timing in timing_qs] return PlacesResourceEvents.objects.filter( - Q(resourceid__in=resource_loi) | - Q(placeid__in=place_loi) | - Q(relationshipdescription__icontains=keyword) | - Q(partused__in=part_loi) | - Q(customaryuse__in=use_loi) | - Q(season__in=season_loi) | - Q(timing__in=timing_loi) + Q(resourceid__in=resource_loi) + | Q(placeid__in=place_loi) + | Q(relationshipdescription__icontains=keyword) + | Q(partused__in=part_loi) + | Q(customaryuse__in=use_loi) + | Q(season__in=season_loi) + | Q(timing__in=timing_loi) ) def __unicode__(self): - return unicode("%s at %s" % (str(self.resourceid), str(self.placeid))) + return unicode("%s at %s" % (str(self.resourceid), str(self.placeid))) # noqa: F821 def __str__(self): - return "%s at %s" % (str(self.resourceid), str(self.placeid)) or '' + return "%s at %s" % (str(self.resourceid), str(self.placeid)) or "" def image(self): - return settings.RECORD_ICONS['activity'] + return settings.RECORD_ICONS["activity"] def subtitle(self): return None def data(self): if self.barterresource: - barter = 'Yes' + barter = "Yes" else: - barter = 'No' + barter = "No" months_list = [ - x for x in [ - 'january', 'february', 'march', 'april', 'may', 'june', 'july', - 'august', 'september', 'october', 'november', 'december' - ] if self.__getattribute__(x) + x + for x in [ + "january", + "february", + "march", + "april", + "may", + "june", + "july", + "august", + "september", + "october", + "november", + "december", + ] + if self.__getattribute__(x) ] if len(months_list) > 0: - months = ', '.join(months_list) + months = ", ".join(months_list) else: - months = 'None' + months = "None" data_list = [] - data_list.append({'key':'place', 'value': str(self.placeid), 'link': "/explore/places/{id}/".format(id=self.placeid.pk)}) - data_list.append({'key':'resource', 'value': str(self.resourceid), 'link': "/explore/resources/{id}/".format(id=self.resourceid.pk)}) - if not self.relationshipdescription == None and len(self.relationshipdescription) > 0: - data_list.append({'key':'excerpt', 'value': self.relationshipdescription}) + data_list.append( + { + "key": "place", + "value": str(self.placeid), + "link": "/explore/places/{id}/".format(id=self.placeid.pk), + } + ) + data_list.append( + { + "key": "resource", + "value": str(self.resourceid), + "link": "/explore/resources/{id}/".format(id=self.resourceid.pk), + } + ) + if ( + self.relationshipdescription is not None + and len(self.relationshipdescription) > 0 + ): + data_list.append({"key": "excerpt", "value": self.relationshipdescription}) if self.partused: - data_list.append({'key':'part used', 'value': str(self.partused)}) - data_list.append({'key':'used for barter', 'value': barter}) - if not self.season == None: - data_list.append({'key':'season', 'value': str(self.season)}) - if not self.timing == None: - data_list.append({'key':'timing', 'value': str(self.timing)}) - if not months == 'None': - data_list.append({'key':'months', 'value': months}) - if not self.year == None: - data_list.append({'key':'year', 'value': str(self.year)}) + data_list.append({"key": "part used", "value": str(self.partused)}) + data_list.append({"key": "used for barter", "value": barter}) + if self.season is not None: + data_list.append({"key": "season", "value": str(self.season)}) + if self.timing is not None: + data_list.append({"key": "timing", "value": str(self.timing)}) + if not months == "None": + data_list.append({"key": "months", "value": months}) + if self.year is not None: + data_list.append({"key": "year", "value": str(self.year)}) return data_list def link(self): - return '/explore/placesresourceevents/%s' % self.pk + return "/explore/placesresourceevents/%s" % self.pk def relationships(self): relationship_list = [] - relationship_list.append({'key':'Place', 'value': [self.placeid.get_query_json()]}) - relationship_list.append({'key':'Resource', 'value': [self.resourceid.get_query_json()]}) - activities = [x.get_query_json() for x in self.resourcesactivityevents_set.all()] + relationship_list.append( + {"key": "Place", "value": [self.placeid.get_query_json()]} + ) + relationship_list.append( + {"key": "Resource", "value": [self.resourceid.get_query_json()]} + ) + activities = [ + x.get_query_json() for x in self.resourcesactivityevents_set.all() + ] if len(activities) > 0: - relationship_list.append({'key':'Activities', 'value': activities}) - citations = [x.get_relationship_json(type(self)) for x in self.placesresourcecitationevents_set.all()] + relationship_list.append({"key": "Activities", "value": activities}) + citations = [ + x.get_relationship_json(type(self)) + for x in self.placesresourcecitationevents_set.all() + ] if len(citations) > 0: - relationship_list.append({'key':'Bibliographic Sources', 'value': citations}) + relationship_list.append( + {"key": "Bibliographic Sources", "value": citations} + ) return relationship_list def get_response_format(self): - type = 'Placesresourceevents' - category_name = 'Place - Resource' + type = "Placesresourceevents" + category_name = "Place - Resource" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': self.relationshipdescription, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": self.relationshipdescription, + "link": "/explore/%s/%d" % (type, self.pk), } + class LookupParticipants(Lookup): - id = models.AutoField(db_column='id', primary_key=True) - participants = models.CharField(db_column='participants', max_length=255) + id = models.AutoField(db_column="id", primary_key=True) + participants = models.CharField(db_column="participants", max_length=255) class Meta: managed = MANAGED - ordering = ['participants'] - db_table = 'lookupparticipants' + ordering = ["participants"] + db_table = "lookupparticipants" app_label = "Lookup" verbose_name = "participant" verbose_name_plural = "participants" def __unicode__(self): - return unicode('%s' % (self.participants)) + return unicode("%s" % (self.participants)) # noqa: F821 def __str__(self): - return self.participants or '' + return self.participants or "" + class LookupTechniques(Lookup): - id = models.AutoField(db_column='id', primary_key=True) - techniques = models.CharField(db_column='techniques', max_length=255) + id = models.AutoField(db_column="id", primary_key=True) + techniques = models.CharField(db_column="techniques", max_length=255) class Meta: managed = MANAGED - ordering = ['techniques'] - db_table = 'lookuptechniques' + ordering = ["techniques"] + db_table = "lookuptechniques" app_label = "Lookup" verbose_name = "technique" verbose_name_plural = "techniques" def __unicode__(self): - return unicode('%s' % (self.techniques)) + return unicode("%s" % (self.techniques)) # noqa: F821 def __str__(self): - return self.techniques or '' + return self.techniques or "" + class LookupActivity(Lookup): - id = models.AutoField(db_column='id', primary_key=True) - activity = models.CharField(db_column='activity', max_length=255) + id = models.AutoField(db_column="id", primary_key=True) + activity = models.CharField(db_column="activity", max_length=255) class Meta: managed = MANAGED - ordering = ['activity'] - db_table = 'lookupactivity' - app_label = 'Lookup' - verbose_name = 'activity' - verbose_name_plural = 'activities' + ordering = ["activity"] + db_table = "lookupactivity" + app_label = "Lookup" + verbose_name = "activity" + verbose_name_plural = "activities" def __unicode__(self): - return unicode('%s' % (self.activity)) + return unicode("%s" % (self.activity)) # noqa: F821 def __str__(self): - return self.activity or '' + return self.activity or "" + class ResourcesActivityEvents(Reviewable, Queryable, Record, ModeratedModel): - resourceactivityid = models.AutoField(db_column='resourceactivityid', primary_key=True) - placeresourceid = models.ForeignKey(PlacesResourceEvents, db_column='placeresourceid', verbose_name='place resource', on_delete=models.PROTECT) - relationshipdescription = HTMLField(db_column='relationshipdescription', blank=True, null=True, verbose_name='excerpt') - partused = models.ForeignKey(LookupPartUsed, db_column='partused', max_length=255, blank=True, null=True, verbose_name='part used', default=None, on_delete=models.SET_DEFAULT) - activityshortdescription = models.ForeignKey(LookupActivity, db_column='activityshortdescription', max_length=255, blank=True, null=True, verbose_name='activity type', default=None, on_delete=models.SET_DEFAULT) - activitylongdescription = HTMLField(db_column='activitylongdescription', blank=True, null=True, verbose_name='full activity description') - participants = models.ForeignKey(LookupParticipants, db_column='participants', max_length=50, blank=True, null=True, default=None, on_delete=models.SET_DEFAULT) - gear = models.CharField(db_column='gear', max_length=255, blank=True, null=True) - technique = models.ForeignKey(LookupTechniques, db_column='technique', max_length=255, blank=True, null=True, default=None, on_delete=models.SET_DEFAULT) - customaryuse = models.CharField(db_column='customaryuse', max_length=255, blank=True, null=True, verbose_name='customary use') - timing = models.ForeignKey(LookupTiming, db_column='timing', max_length=255, blank=True, null=True, default=None, on_delete=models.SET_DEFAULT) - timingdescription = models.CharField(db_column='timingdescription', max_length=255, blank=True, null=True, verbose_name='timing description') - islocked = models.BooleanField(db_column='islocked', default=False, verbose_name='locked?') + resourceactivityid = models.AutoField( + db_column="resourceactivityid", primary_key=True + ) + placeresourceid = models.ForeignKey( + PlacesResourceEvents, + db_column="placeresourceid", + verbose_name="place resource", + on_delete=models.PROTECT, + ) + relationshipdescription = HTMLField( + db_column="relationshipdescription", + blank=True, + null=True, + verbose_name="excerpt", + ) + partused = models.ForeignKey( + LookupPartUsed, + db_column="partused", + max_length=255, + blank=True, + null=True, + verbose_name="part used", + default=None, + on_delete=models.SET_DEFAULT, + ) + activityshortdescription = models.ForeignKey( + LookupActivity, + db_column="activityshortdescription", + max_length=255, + blank=True, + null=True, + verbose_name="activity type", + default=None, + on_delete=models.SET_DEFAULT, + ) + activitylongdescription = HTMLField( + db_column="activitylongdescription", + blank=True, + null=True, + verbose_name="full activity description", + ) + participants = models.ForeignKey( + LookupParticipants, + db_column="participants", + max_length=50, + blank=True, + null=True, + default=None, + on_delete=models.SET_DEFAULT, + ) + gear = models.CharField(db_column="gear", max_length=255, blank=True, null=True) + technique = models.ForeignKey( + LookupTechniques, + db_column="technique", + max_length=255, + blank=True, + null=True, + default=None, + on_delete=models.SET_DEFAULT, + ) + customaryuse = models.CharField( + db_column="customaryuse", + max_length=255, + blank=True, + null=True, + verbose_name="customary use", + ) + timing = models.ForeignKey( + LookupTiming, + db_column="timing", + max_length=255, + blank=True, + null=True, + default=None, + on_delete=models.SET_DEFAULT, + ) + timingdescription = models.CharField( + db_column="timingdescription", + max_length=255, + blank=True, + null=True, + verbose_name="timing description", + ) + islocked = models.BooleanField( + db_column="islocked", default=False, verbose_name="locked?" + ) class Meta: managed = MANAGED - db_table = 'resourcesactivityevents' - verbose_name = 'Activity' - verbose_name_plural = 'Activities' + db_table = "resourcesactivityevents" + verbose_name = "Activity" + verbose_name_plural = "Activities" def __unicode__(self): - return unicode("%s: %s" % (str(self.placeresourceid), self.activityshortdescription)) + return unicode( # noqa: F821 + "%s: %s" % (str(self.placeresourceid), self.activityshortdescription) + ) def __str__(self): - if not self.activityshortdescription == None: + if self.activityshortdescription is not None: activity_name = self.activityshortdescription else: - activity_name = 'Unspecified Activity' - return "{activity} at {place} involving {resource}".format(activity=activity_name, place=self.placeresourceid.placeid, resource=self.placeresourceid.resourceid) + activity_name = "Unspecified Activity" + return "{activity} at {place} involving {resource}".format( + activity=activity_name, + place=self.placeresourceid.placeid, + resource=self.placeresourceid.resourceid, + ) # return "%s: %s" % (str(self.placeresourceid), self.activityshortdescription) or '' @property def excerpt_text(self): from django.utils.html import strip_tags from html import unescape + return unescape(strip_tags(self.relationshipdescription)) def keyword_search( - keyword, # string - fields=['relationshipdescription','activitylongdescription','gear','customaryuse','timingdescription'], # fields to search - fk_fields=[ - ('partused','partused'), - ('placeresourceid','resourceid','commonname'), - ('placeresourceid','placeid','englishplacename'), - ('placeresourceid','placeid','indigenousplacename'), - ('placeresourceid','placeid','placealtindigenousname', 'altindigenousname'), - ('activityshortdescription','activity'), - ('participants','participants'), - ('technique','techniques'), - ('timing','timing') - ] # fields to search for fk objects - ): - + keyword, # string + fields=[ + "relationshipdescription", + "activitylongdescription", + "gear", + "customaryuse", + "timingdescription", + ], # fields to search + fk_fields=[ + ("partused", "partused"), + ("placeresourceid", "resourceid", "commonname"), + ("placeresourceid", "placeid", "englishplacename"), + ("placeresourceid", "placeid", "indigenousplacename"), + ( + "placeresourceid", + "placeid", + "placealtindigenousname", + "altindigenousname", + ), + ("activityshortdescription", "activity"), + ("participants", "participants"), + ("technique", "techniques"), + ("timing", "timing"), + ], # fields to search for fk objects + ): weight_lookup = { - 'relationshipdescription': 'B', - 'activitylongdescription': 'A', - 'gear': 'B', - 'customaryuse': 'B', - 'timingdescription': 'B', - 'partused': 'C', - 'placeresourceid': 'A', - 'activityshortdescription': 'A', - 'participants': 'C', - 'technique': 'C', - 'timing': 'C' + "relationshipdescription": "B", + "activitylongdescription": "A", + "gear": "B", + "customaryuse": "B", + "timingdescription": "B", + "partused": "C", + "placeresourceid": "A", + "activityshortdescription": "A", + "participants": "C", + "technique": "C", + "timing": "C", } - sort_field = 'activitylongdescription' + sort_field = "activitylongdescription" - return run_keyword_search(ResourcesActivityEvents, keyword, fields, fk_fields, weight_lookup, sort_field) + return run_keyword_search( + ResourcesActivityEvents, + keyword, + fields, + fk_fields, + weight_lookup, + sort_field, + ) # def keyword_search(keyword): # placeresource_qs = PlacesResourceEvents.keyword_search(keyword) @@ -1107,118 +1567,185 @@ def keyword_search( # ) def image(self): - return settings.RECORD_ICONS['activity'] + return settings.RECORD_ICONS["activity"] def subtitle(self): return None def link(self): - return '/explore/resourcesactivityevents/%d/' % self.pk + return "/explore/resourcesactivityevents/%d/" % self.pk def relationships(self): relationship_list = [] - relationship_list.append({'key':'Place-Resource', 'value': [self.placeresourceid.get_query_json()]}) - citations = [x.get_relationship_json(type(self)) for x in self.resourceactivitycitationevents_set.all()] + relationship_list.append( + {"key": "Place-Resource", "value": [self.placeresourceid.get_query_json()]} + ) + citations = [ + x.get_relationship_json(type(self)) + for x in self.resourceactivitycitationevents_set.all() + ] if len(citations) > 0: - relationship_list.append({'key':'Bibliographic Sources', 'value': citations}) + relationship_list.append( + {"key": "Bibliographic Sources", "value": citations} + ) media = [x.get_query_json() for x in self.resourceactivitymediaevents_set.all()] if len(media) > 0: - relationship_list.append({'key':'Media', 'value': media}) + relationship_list.append({"key": "Media", "value": media}) return relationship_list def data(self): data_list = [] - data_list.append({'key':'place', 'value': str(self.placeresourceid.placeid), 'link': "/explore/places/{id}/".format(id=self.placeresourceid.placeid.pk)}) - data_list.append({'key':'resource', 'value': str(self.placeresourceid.resourceid), 'link': "/explore/resources/{id}/".format(id=self.placeresourceid.resourceid.pk)}) - if not self.relationshipdescription == None and len(self.relationshipdescription) > 0: - data_list.append({'key':'excerpt', 'value': self.relationshipdescription}) - if not self.partused == None: - data_list.append({'key':'part used', 'value': str(self.partused)}) - if not self.activityshortdescription == None: - data_list.append({'key':'activity type', 'value': str(self.activityshortdescription)}) - if not self.activitylongdescription == None and not self.activitylongdescription == '': - data_list.append({'key':'full description', 'value': self.activitylongdescription}) - if not self.participants == None: - data_list.append({'key':'participants', 'value': str(self.participants)}) - if not self.technique == None: - data_list.append({'key':'technique', 'value': str(self.technique)}) - if not self.gear == None: - data_list.append({'key':'gear', 'value': self.gear}) - if not self.customaryuse == None: - data_list.append({'key':'customary use', 'value': str(self.customaryuse)}) - if not self.timing == None: - data_list.append({'key':'timing', 'value': str(self.timing)}) - if not self.timingdescription == None: - data_list.append({'key':'timing description', 'value': self.timingdescription}) + data_list.append( + { + "key": "place", + "value": str(self.placeresourceid.placeid), + "link": "/explore/places/{id}/".format( + id=self.placeresourceid.placeid.pk + ), + } + ) + data_list.append( + { + "key": "resource", + "value": str(self.placeresourceid.resourceid), + "link": "/explore/resources/{id}/".format( + id=self.placeresourceid.resourceid.pk + ), + } + ) + if ( + self.relationshipdescription is not None + and len(self.relationshipdescription) > 0 + ): + data_list.append({"key": "excerpt", "value": self.relationshipdescription}) + if self.partused is not None: + data_list.append({"key": "part used", "value": str(self.partused)}) + if self.activityshortdescription is not None: + data_list.append( + {"key": "activity type", "value": str(self.activityshortdescription)} + ) + if ( + self.activitylongdescription is not None + and not self.activitylongdescription == "" + ): + data_list.append( + {"key": "full description", "value": self.activitylongdescription} + ) + if self.participants is not None: + data_list.append({"key": "participants", "value": str(self.participants)}) + if self.technique is not None: + data_list.append({"key": "technique", "value": str(self.technique)}) + if self.gear is not None: + data_list.append({"key": "gear", "value": self.gear}) + if self.customaryuse is not None: + data_list.append({"key": "customary use", "value": str(self.customaryuse)}) + if self.timing is not None: + data_list.append({"key": "timing", "value": str(self.timing)}) + if self.timingdescription is not None: + data_list.append( + {"key": "timing description", "value": self.timingdescription} + ) return data_list def get_response_format(self): - type = 'Resourcesactivityevents' - category_name = 'Activity' + type = "Resourcesactivityevents" + category_name = "Activity" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': self.relationshipdescription, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": self.relationshipdescription, + "link": "/explore/%s/%d" % (type, self.pk), } def get_related_objects(self, object_id): citation_events = self.resourceactivitycitationevents_set.all() media_events = self.resourceactivitymediaevents_set.all() return [ - {'title': 'Citation Relationships', 'data': self.format_data(citation_events, 'resourceactivityid', ['resource activity'])}, - {'title': 'Media Relationships', 'data': self.format_data(media_events, 'resourceactivityid', ['resource activity'])}, + { + "title": "Citation Relationships", + "data": self.format_data( + citation_events, "resourceactivityid", ["resource activity"] + ), + }, + { + "title": "Media Relationships", + "data": self.format_data( + media_events, "resourceactivityid", ["resource activity"] + ), + }, ] + class People(Lookup): - personid = models.AutoField(db_column='personid', primary_key=True) - firstname = models.CharField(db_column='firstname', max_length=255, blank=True, null=True, verbose_name='first name') - lastname = models.CharField(db_column='lastname', max_length=255, blank=True, null=True, verbose_name='last name') - village = models.CharField(db_column='village', max_length=255, blank=True, null=True) - yearborn = models.IntegerField(db_column='yearborn', blank=True, null=True, verbose_name='year born') - relationshiptootherpeople = HTMLField(db_column='relationshiptootherpeople', blank=True, null=True, verbose_name='relationship to other people') + personid = models.AutoField(db_column="personid", primary_key=True) + firstname = models.CharField( + db_column="firstname", + max_length=255, + blank=True, + null=True, + verbose_name="first name", + ) + lastname = models.CharField( + db_column="lastname", + max_length=255, + blank=True, + null=True, + verbose_name="last name", + ) + village = models.CharField( + db_column="village", max_length=255, blank=True, null=True + ) + yearborn = models.IntegerField( + db_column="yearborn", blank=True, null=True, verbose_name="year born" + ) + relationshiptootherpeople = HTMLField( + db_column="relationshiptootherpeople", + blank=True, + null=True, + verbose_name="relationship to other people", + ) class Meta: managed = MANAGED - db_table = 'people' + db_table = "people" app_label = "Lookup" verbose_name = "person" verbose_name_plural = "people" def keyword_search(keyword): return People.objects.filter( - Q(firstname__icontains=keyword) | - Q(lastname__icontains=keyword) | - Q(village__icontains=keyword) | - Q(relationshiptootherpeople__icontains=keyword) + Q(firstname__icontains=keyword) + | Q(lastname__icontains=keyword) + | Q(village__icontains=keyword) + | Q(relationshiptootherpeople__icontains=keyword) ) def __unicode__(self): - return unicode("%s %s" % (self.firstname, self.lastname)) + return unicode("%s %s" % (self.firstname, self.lastname)) # noqa: F821 def __str__(self): - return "%s %s" % (self.firstname, self.lastname) or '' + return "%s %s" % (self.firstname, self.lastname) or "" def image(self): - #TODO: Better icon or no icon - return settings.RECORD_ICONS['person'] + # TODO: Better icon or no icon + return settings.RECORD_ICONS["person"] def data(self): return [ - {'key':'first name', 'value': self.firstname}, - {'key':'last name', 'value': self.lastname}, - {'key':'year born', 'value': str(self.yearborn)}, - {'key':'village', 'value': self.village}, - {'key':'relationship to others', 'value': self.relationshiptootherpeople} + {"key": "first name", "value": self.firstname}, + {"key": "last name", "value": self.lastname}, + {"key": "year born", "value": str(self.yearborn)}, + {"key": "village", "value": self.village}, + {"key": "relationship to others", "value": self.relationshiptootherpeople}, ] def link(self): - return '/explore/people/%s' % self.pk + return "/explore/people/%s" % self.pk def relationships(self): relationship_list = [] @@ -1226,131 +1753,250 @@ def relationships(self): interviewer_citations = [x.get_query_json() for x in self.interviewer.all()] # citations = list(set(interviewee_citations) | set(interviewer_citations)) if len(interviewee_citations) > 0: - relationship_list.append({'key': 'Sources as interviewee', 'value': interviewee_citations}) + relationship_list.append( + {"key": "Sources as interviewee", "value": interviewee_citations} + ) if len(interviewer_citations) > 0: - relationship_list.append({'key': 'Sources as interviewer', 'value': interviewer_citations}) + relationship_list.append( + {"key": "Sources as interviewer", "value": interviewer_citations} + ) return relationship_list - #Actually a dict, not true JSON. + # Actually a dict, not true JSON. def get_query_json(self): return { - 'name': str(self), - 'image': self.image(), - 'subtitle': self.village, - 'data': self.data(), - 'link': self.link() + "name": str(self), + "image": self.image(), + "subtitle": self.village, + "data": self.data(), + "link": self.link(), } def get_record_dict(self, user, srid=None): return { - 'name': str(self), - 'image': self.image(), - 'subtitle': self.village, - 'data': self.data(), - 'relationships': self.relationships(), - 'map': False, + "name": str(self), + "image": self.image(), + "subtitle": self.village, + "data": self.data(), + "relationships": self.relationships(), + "map": False, # 'link': self.link(), } + class LookupReferenceType(Lookup): - id = models.AutoField(db_column='id', primary_key=True) - documenttype = models.CharField(db_column='documenttype', max_length=25, verbose_name='document type') + id = models.AutoField(db_column="id", primary_key=True) + documenttype = models.CharField( + db_column="documenttype", max_length=25, verbose_name="document type" + ) class Meta: managed = MANAGED - ordering = ['documenttype'] - db_table = 'lookupreferencetype' + ordering = ["documenttype"] + db_table = "lookupreferencetype" app_label = "Lookup" - verbose_name="reference type" - verbose_name_plural="reference types" + verbose_name = "reference type" + verbose_name_plural = "reference types" def __unicode__(self): - return unicode('%s' % (self.documenttype)) + return unicode("%s" % (self.documenttype)) # noqa: F821 def __str__(self): - return self.documenttype or '' + return self.documenttype or "" + class LookupAuthorType(Lookup): - id = models.AutoField(db_column='id', primary_key=True) - authortype = models.CharField(db_column='authortype', max_length=50, verbose_name='author type') + id = models.AutoField(db_column="id", primary_key=True) + authortype = models.CharField( + db_column="authortype", max_length=50, verbose_name="author type" + ) class Meta: managed = MANAGED - ordering = ['authortype'] - db_table = 'lookupauthortype' - app_label = 'Lookup' - verbose_name = 'author type' - verbose_name_plural = 'author types' - + ordering = ["authortype"] + db_table = "lookupauthortype" + app_label = "Lookup" + verbose_name = "author type" + verbose_name_plural = "author types" def __unicode__(self): - return unicode('%s' % (self.authortype)) + return unicode("%s" % (self.authortype)) # noqa: F821 def __str__(self): - return self.authortype or '' + return self.authortype or "" + class Citations(Reviewable, Queryable, Record, ModeratedModel): - citationid = models.AutoField(db_column='citationid', primary_key=True) - referencetype = models.ForeignKey(LookupReferenceType, db_column='referencetype', max_length=255, verbose_name='reference type', help_text="Select a reference type to continue", on_delete=models.PROTECT) - referencetext = models.TextField(db_column='referencetext', blank=True, null=True, verbose_name='description') - authortype = models.ForeignKey(LookupAuthorType, db_column='authortype', max_length=255, blank=True, null=True, verbose_name='author type', default=None, on_delete=models.SET_DEFAULT) - authorprimary = models.CharField(db_column='authorprimary', max_length=255, blank=True, null=True, verbose_name='primary author') - authorsecondary = models.CharField(db_column='authorsecondary', max_length=255, blank=True, null=True, verbose_name='secondary author') - intervieweeid = models.ForeignKey(People, db_column='intervieweeid', related_name='interviewee', blank=True, null=True, verbose_name='interviewee', default=None, on_delete=models.SET_DEFAULT) - interviewerid = models.ForeignKey(People, db_column='interviewerid', related_name='interviewer', blank=True, null=True, verbose_name='interviewer', default=None, on_delete=models.SET_DEFAULT) - placeofinterview = models.CharField(db_column='placeofinterview', max_length=255, blank=True, null=True, verbose_name='place of interview') - date = models.DateField(db_column='date', blank=True, null=True, default=None) - year = models.IntegerField(db_column='year', blank=True, null=True) - title = models.TextField(db_column='title', blank=True, null=True) - seriestitle = models.CharField(db_column='seriestitle', max_length=255, blank=True, null=True, verbose_name='series title') - seriesvolume = models.CharField(db_column='seriesvolume', max_length=50, blank=True, null=True, verbose_name='series volume') - serieseditor = models.CharField(db_column='serieseditor', max_length=255, blank=True, null=True, verbose_name='series editor') - publisher = models.CharField(db_column='publisher', max_length=100, blank=True, null=True) - publishercity = models.CharField(db_column='publishercity', max_length=255, blank=True, null=True, verbose_name='city') - preparedfor = models.CharField(db_column='preparedfor', max_length=100, blank=True, null=True, verbose_name='prepared_for') - rawcitation = HTMLField(db_column='rawcitation', blank=True, null=True, verbose_name='Raw, formatted bibliographic citation', help_text="If you have the text for a bibliographic citation already formatted as you'd like it, please share it here.") - comments = HTMLField(db_column='comments', blank=True, null=True) - journal = models.TextField(db_column='journal', blank=True, null=True, verbose_name='journal') - journalpages = models.TextField(db_column='journalpages', blank=True, null=True, verbose_name='journal pages') + citationid = models.AutoField(db_column="citationid", primary_key=True) + referencetype = models.ForeignKey( + LookupReferenceType, + db_column="referencetype", + max_length=255, + verbose_name="reference type", + help_text="Select a reference type to continue", + on_delete=models.PROTECT, + ) + referencetext = models.TextField( + db_column="referencetext", blank=True, null=True, verbose_name="description" + ) + authortype = models.ForeignKey( + LookupAuthorType, + db_column="authortype", + max_length=255, + blank=True, + null=True, + verbose_name="author type", + default=None, + on_delete=models.SET_DEFAULT, + ) + authorprimary = models.CharField( + db_column="authorprimary", + max_length=255, + blank=True, + null=True, + verbose_name="primary author", + ) + authorsecondary = models.CharField( + db_column="authorsecondary", + max_length=255, + blank=True, + null=True, + verbose_name="secondary author", + ) + intervieweeid = models.ForeignKey( + People, + db_column="intervieweeid", + related_name="interviewee", + blank=True, + null=True, + verbose_name="interviewee", + default=None, + on_delete=models.SET_DEFAULT, + ) + interviewerid = models.ForeignKey( + People, + db_column="interviewerid", + related_name="interviewer", + blank=True, + null=True, + verbose_name="interviewer", + default=None, + on_delete=models.SET_DEFAULT, + ) + placeofinterview = models.CharField( + db_column="placeofinterview", + max_length=255, + blank=True, + null=True, + verbose_name="place of interview", + ) + date = models.DateField(db_column="date", blank=True, null=True, default=None) + year = models.IntegerField(db_column="year", blank=True, null=True) + title = models.TextField(db_column="title", blank=True, null=True) + seriestitle = models.CharField( + db_column="seriestitle", + max_length=255, + blank=True, + null=True, + verbose_name="series title", + ) + seriesvolume = models.CharField( + db_column="seriesvolume", + max_length=50, + blank=True, + null=True, + verbose_name="series volume", + ) + serieseditor = models.CharField( + db_column="serieseditor", + max_length=255, + blank=True, + null=True, + verbose_name="series editor", + ) + publisher = models.CharField( + db_column="publisher", max_length=100, blank=True, null=True + ) + publishercity = models.CharField( + db_column="publishercity", + max_length=255, + blank=True, + null=True, + verbose_name="city", + ) + preparedfor = models.CharField( + db_column="preparedfor", + max_length=100, + blank=True, + null=True, + verbose_name="prepared_for", + ) + rawcitation = HTMLField( + db_column="rawcitation", + blank=True, + null=True, + verbose_name="Raw, formatted bibliographic citation", + help_text="If you have the text for a bibliographic citation already formatted as you'd like it, please share it here.", + ) + comments = HTMLField(db_column="comments", blank=True, null=True) + journal = models.TextField( + db_column="journal", blank=True, null=True, verbose_name="journal" + ) + journalpages = models.TextField( + db_column="journalpages", blank=True, null=True, verbose_name="journal pages" + ) class Meta: managed = MANAGED - db_table = 'citations' - verbose_name = 'Bibliographic Source' - verbose_name_plural = 'Bibliographic Sources' + db_table = "citations" + verbose_name = "Bibliographic Source" + verbose_name_plural = "Bibliographic Sources" def keyword_search( - keyword, # string - fields=['referencetext','authorprimary','authorsecondary','placeofinterview','title','seriestitle','seriesvolume','serieseditor','publisher','publishercity','preparedfor'], # fields to search - fk_fields=[ - ('referencetype','documenttype'), - ('authortype','authortype'), - # ('intervieweeid','interviewee'), - # ('interviewerid','interviewer') - ] # fields to search for fk objects - ): - + keyword, # string + fields=[ + "referencetext", + "authorprimary", + "authorsecondary", + "placeofinterview", + "title", + "seriestitle", + "seriesvolume", + "serieseditor", + "publisher", + "publishercity", + "preparedfor", + ], # fields to search + fk_fields=[ + ("referencetype", "documenttype"), + ("authortype", "authortype"), + # ('intervieweeid','interviewee'), + # ('interviewerid','interviewer') + ], # fields to search for fk objects + ): weight_lookup = { - 'referencetext': 'A', - 'authorprimary': 'A', - 'authorsecondary': 'A', - 'placeofinterview': 'C', - 'title': 'A', - 'seriestitle': 'C', - 'seriesvolume': 'C', - 'serieseditor': 'C', - 'publisher': 'C', - 'publishercity': 'C', - 'preparedfor': 'C', - 'referencetype': 'B', - 'authortype': 'B', + "referencetext": "A", + "authorprimary": "A", + "authorsecondary": "A", + "placeofinterview": "C", + "title": "A", + "seriestitle": "C", + "seriesvolume": "C", + "serieseditor": "C", + "publisher": "C", + "publishercity": "C", + "preparedfor": "C", + "referencetype": "B", + "authortype": "B", # 'intervieweeid': 'B', # 'interviewerid': 'B' } - sort_field = 'referencetext' + sort_field = "referencetext" - return run_keyword_search(Citations, keyword, fields, fk_fields, weight_lookup, sort_field) + return run_keyword_search( + Citations, keyword, fields, fk_fields, weight_lookup, sort_field + ) # def keyword_search(keyword): # reference_qs = LookupReferenceType.objects.filter(documenttype__icontains=keyword) @@ -1383,119 +2029,135 @@ def keyword_search( # ) def image(self): - return settings.RECORD_ICONS['citation'] + return settings.RECORD_ICONS["citation"] def subtitle(self): return self.referencetext def link(self): - return '/explore/citations/%d/' % self.pk + return "/explore/citations/%d/" % self.pk def relationships(self): relationship_list = [] - if self.referencetype.documenttype == 'Interview': + if self.referencetype.documenttype == "Interview": people = [] - if not self.intervieweeid == None: + if self.intervieweeid is not None: people.append(self.intervieweeid.get_query_json()) - if not self.interviewerid == None: + if self.interviewerid is not None: people.append(self.interviewerid.get_query_json()) if len(people) > 0: - relationship_list.append({'key':'People', 'value': people}) - places = [x.get_relationship_json(type(self)) for x in self.placescitationevents_set.all()] + relationship_list.append({"key": "People", "value": people}) + places = [ + x.get_relationship_json(type(self)) + for x in self.placescitationevents_set.all() + ] if len(places) > 0: - relationship_list.append({'key': 'Places', 'value': places}) - resources = [x.get_relationship_json(type(self)) for x in self.resourcescitationevents_set.all()] + relationship_list.append({"key": "Places", "value": places}) + resources = [ + x.get_relationship_json(type(self)) + for x in self.resourcescitationevents_set.all() + ] if len(resources) > 0: - relationship_list.append({'key': 'Resources', 'value': resources}) - media = [x.get_relationship_json(type(self)) for x in self.mediacitationevents_set.all()] + relationship_list.append({"key": "Resources", "value": resources}) + media = [ + x.get_relationship_json(type(self)) + for x in self.mediacitationevents_set.all() + ] if len(media) > 0: - relationship_list.append({'key': 'Media', 'value': media}) - activities = [x.get_relationship_json(type(self)) for x in self.resourceactivitycitationevents_set.all()] + relationship_list.append({"key": "Media", "value": media}) + activities = [ + x.get_relationship_json(type(self)) + for x in self.resourceactivitycitationevents_set.all() + ] if len(activities) > 0: - relationship_list.append({'key': 'Activities', 'value': activities}) - placesResources = [x.get_relationship_json(type(self)) for x in self.placesresourcecitationevents_set.all()] + relationship_list.append({"key": "Activities", "value": activities}) + placesResources = [ + x.get_relationship_json(type(self)) + for x in self.placesresourcecitationevents_set.all() + ] if len(placesResources) > 0: - relationship_list.append({'key': 'Place-Resources', 'value': placesResources}) + relationship_list.append( + {"key": "Place-Resources", "value": placesResources} + ) return relationship_list def data(self): - - if str(self.referencetype).lower() == 'book': + if str(self.referencetype).lower() == "book": return [ - {'key':'reference type', 'value': str(self.referencetype)}, - {'key':'title', 'value': self.title}, - {'key':'description', 'value': self.referencetext}, - {'key':'year', 'value': self.year}, - {'key':'primary author', 'value': self.authorprimary}, - {'key':'secondary author', 'value': self.authorsecondary}, - {'key':'publisher', 'value': self.publisher}, - {'key':'publisher city', 'value': self.publishercity}, - {'key':'raw citation', 'value': self.rawcitation}, - {'key':'comments', 'value': self.comments}, + {"key": "reference type", "value": str(self.referencetype)}, + {"key": "title", "value": self.title}, + {"key": "description", "value": self.referencetext}, + {"key": "year", "value": self.year}, + {"key": "primary author", "value": self.authorprimary}, + {"key": "secondary author", "value": self.authorsecondary}, + {"key": "publisher", "value": self.publisher}, + {"key": "publisher city", "value": self.publishercity}, + {"key": "raw citation", "value": self.rawcitation}, + {"key": "comments", "value": self.comments}, ] - if str(self.referencetype).lower() == 'edited volume': + if str(self.referencetype).lower() == "edited volume": return [ - {'key':'reference type', 'value': str(self.referencetype)}, - {'key':'title', 'value': self.title}, - {'key':'description', 'value': self.referencetext}, - {'key':'year', 'value': self.year}, - {'key':'primary author', 'value': self.authorprimary}, - {'key':'secondary author', 'value': self.authorsecondary}, - {'key':'publisher', 'value': self.publisher}, - {'key':'publisher city', 'value': self.publishercity}, - {'key':'series volume', 'value': self.seriesvolume}, - {'key':'series title', 'value': self.seriestitle}, - {'key':'series editor', 'value': self.serieseditor}, - {'key':'raw citation', 'value': self.rawcitation}, - {'key':'comments', 'value': self.comments}, + {"key": "reference type", "value": str(self.referencetype)}, + {"key": "title", "value": self.title}, + {"key": "description", "value": self.referencetext}, + {"key": "year", "value": self.year}, + {"key": "primary author", "value": self.authorprimary}, + {"key": "secondary author", "value": self.authorsecondary}, + {"key": "publisher", "value": self.publisher}, + {"key": "publisher city", "value": self.publishercity}, + {"key": "series volume", "value": self.seriesvolume}, + {"key": "series title", "value": self.seriestitle}, + {"key": "series editor", "value": self.serieseditor}, + {"key": "raw citation", "value": self.rawcitation}, + {"key": "comments", "value": self.comments}, ] - if str(self.referencetype).lower() == 'interview': + if str(self.referencetype).lower() == "interview": return [ - {'key':'reference type', 'value': str(self.referencetype)}, - {'key':'description', 'value': self.referencetext}, - {'key':'interviewee', 'value': str(self.intervieweeid)}, - {'key':'interviewer', 'value': str(self.interviewerid)}, - {'key':'year', 'value': self.year}, - {'key':'place of interview', 'value': self.placeofinterview}, - {'key':'raw citation', 'value': self.rawcitation}, - {'key':'comments', 'value': self.comments}, + {"key": "reference type", "value": str(self.referencetype)}, + {"key": "description", "value": self.referencetext}, + {"key": "interviewee", "value": str(self.intervieweeid)}, + {"key": "interviewer", "value": str(self.interviewerid)}, + {"key": "year", "value": self.year}, + {"key": "place of interview", "value": self.placeofinterview}, + {"key": "raw citation", "value": self.rawcitation}, + {"key": "comments", "value": self.comments}, ] return [ - {'key':'reference type', 'value': str(self.referencetype)}, - {'key':'title', 'value': self.title}, - {'key':'description', 'value': self.referencetext}, - {'key':'year', 'value': self.year}, - {'key':'primary author', 'value': self.authorprimary}, - {'key':'secondary author', 'value': self.authorsecondary}, - {'key':'publisher', 'value': self.publisher}, - {'key':'publisher city', 'value': self.publishercity}, - {'key':'series volume', 'value': self.seriesvolume}, - {'key':'series title', 'value': self.seriestitle}, - {'key':'series editor', 'value': self.serieseditor}, - {'key':'interviewee', 'value': str(self.intervieweeid)}, - {'key':'interviewer', 'value': str(self.interviewerid)}, - {'key':'place of interview', 'value': self.placeofinterview}, - {'key':'journal', 'value': self.journal}, - {'key':'journal pages', 'value': self.journalpages}, - {'key':'prepared for', 'value': self.preparedfor}, - {'key':'raw citation', 'value': self.rawcitation}, - {'key':'comments', 'value': self.comments}, + {"key": "reference type", "value": str(self.referencetype)}, + {"key": "title", "value": self.title}, + {"key": "description", "value": self.referencetext}, + {"key": "year", "value": self.year}, + {"key": "primary author", "value": self.authorprimary}, + {"key": "secondary author", "value": self.authorsecondary}, + {"key": "publisher", "value": self.publisher}, + {"key": "publisher city", "value": self.publishercity}, + {"key": "series volume", "value": self.seriesvolume}, + {"key": "series title", "value": self.seriestitle}, + {"key": "series editor", "value": self.serieseditor}, + {"key": "interviewee", "value": str(self.intervieweeid)}, + {"key": "interviewer", "value": str(self.interviewerid)}, + {"key": "place of interview", "value": self.placeofinterview}, + {"key": "journal", "value": self.journal}, + {"key": "journal pages", "value": self.journalpages}, + {"key": "prepared for", "value": self.preparedfor}, + {"key": "raw citation", "value": self.rawcitation}, + {"key": "comments", "value": self.comments}, ] def get_response_format(self): - type = 'citations' - category_name = 'Source' + type = "citations" + category_name = "Source" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': self.referencetext, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": self.referencetext, + "link": "/explore/%s/%d" % (type, self.pk), } def get_related_objects(self, object_id): @@ -1505,60 +2167,107 @@ def get_related_objects(self, object_id): place_resource_events = self.placesresourcecitationevents_set.all() activity_events = self.resourceactivitycitationevents_set.all() return [ - {'title': 'Place Relationships', 'data': self.format_data(place_events, 'citationid', ['citation'])}, - {'title': 'Resource Relationships', 'data': self.format_data(resource_events, 'citationid', ['citation'])}, - {'title': 'Media Relationships', 'data': self.format_data(media_events, 'citationid', ['citation'])}, - {'title': 'Place-Resource Relationships', 'data': self.format_data(place_resource_events, 'citationid', ['citation'])}, - {'title': 'Activity Relationships', 'data': self.format_data(activity_events, 'citationid', ['citation'])}, + { + "title": "Place Relationships", + "data": self.format_data(place_events, "citationid", ["citation"]), + }, + { + "title": "Resource Relationships", + "data": self.format_data(resource_events, "citationid", ["citation"]), + }, + { + "title": "Media Relationships", + "data": self.format_data(media_events, "citationid", ["citation"]), + }, + { + "title": "Place-Resource Relationships", + "data": self.format_data( + place_resource_events, "citationid", ["citation"] + ), + }, + { + "title": "Activity Relationships", + "data": self.format_data(activity_events, "citationid", ["citation"]), + }, ] @property def title_text(self): - if str(self.referencetype).lower() == 'interview': - return "%s: interviewed by %s" % (str(self.intervieweeid), str(self.interviewerid)) + if str(self.referencetype).lower() == "interview": + return "%s: interviewed by %s" % ( + str(self.intervieweeid), + str(self.interviewerid), + ) from django.utils.html import strip_tags from html import unescape + return unescape(strip_tags(self.title)) @property def description_text(self): from django.utils.html import strip_tags from html import unescape + return unescape(strip_tags(self.referencetext)) def __str__(self): - if str(self.referencetype) == 'Interview': + if str(self.referencetype) == "Interview": try: interviewee = People.objects.get(pk=self.intervieweeid.pk) - except Exception as e: - interviewee = 'Unknown Interviewee' + except Exception: + interviewee = "Unknown Interviewee" # return '[%s] %s (%d) - %d' % (str(self.referencetype), interviewee, self.year, self.pk) - return '[%s] %s (%s)' % (str(self.referencetype), str(interviewee), str(self.year)) or '' + return ( + "[%s] %s (%s)" + % (str(self.referencetype), str(interviewee), str(self.year)) + or "" + ) else: - return '[%s] %s (%s)' % (str(self.referencetype), str(self.title), str(self.year)) or '' + return ( + "[%s] %s (%s)" + % (str(self.referencetype), str(self.title), str(self.year)) + or "" + ) def __unicode__(self): - return unicode('%s' % (str(self))) + return unicode("%s" % (str(self))) # noqa: F821 + class PlacesCitationEvents(SimpleRelationship): - placeid = models.ForeignKey(Places, db_column='placeid', primary_key=False, verbose_name='place', on_delete=models.CASCADE) - citationid = models.ForeignKey(Citations, db_column='citationid', verbose_name='citation', on_delete=models.CASCADE) - relationshipdescription = HTMLField(db_column='relationshipdescription', blank=True, null=True, verbose_name='excerpt/description') - pages = models.CharField(db_column='pages', max_length=255, blank=True, null=True) + placeid = models.ForeignKey( + Places, + db_column="placeid", + primary_key=False, + verbose_name="place", + on_delete=models.CASCADE, + ) + citationid = models.ForeignKey( + Citations, + db_column="citationid", + verbose_name="citation", + on_delete=models.CASCADE, + ) + relationshipdescription = HTMLField( + db_column="relationshipdescription", + blank=True, + null=True, + verbose_name="excerpt/description", + ) + pages = models.CharField(db_column="pages", max_length=255, blank=True, null=True) class Meta: managed = MANAGED - db_table = 'placescitationevents' + db_table = "placescitationevents" app_label = "Relationships" - verbose_name = 'Place - Source' - verbose_name_plural = 'Places - Sources' - unique_together = (('placeid', 'citationid'),) + verbose_name = "Place - Source" + verbose_name_plural = "Places - Sources" + unique_together = (("placeid", "citationid"),) def __unicode__(self): - return unicode("%s %s" % (str(self.placeid), str(self.citationid))) + return unicode("%s %s" % (str(self.placeid), str(self.citationid))) # noqa: F821 def __str__(self): - return "%s %s" % (str(self.placeid), str(self.citationid)) or '' + return "%s %s" % (str(self.placeid), str(self.citationid)) or "" def keyword_search(keyword): place_qs = Places.keyword_search(keyword) @@ -1568,51 +2277,56 @@ def keyword_search(keyword): citation_loi = [citation.pk for citation in citation_qs] return PlacesCitationEvents.objects.filter( - Q(citationid__in=citation_loi) | - Q(placeid__in=place_loi) | - Q(relationshipdescription__icontains=keyword) + Q(citationid__in=citation_loi) + | Q(placeid__in=place_loi) + | Q(relationshipdescription__icontains=keyword) ) @property def description_text(self): from django.utils.html import strip_tags from html import unescape + return unescape(strip_tags(self.relationshipdescription)) def image(self): - return settings.RECORD_ICONS['activity'] + return settings.RECORD_ICONS["activity"] def subtitle(self): return self.relationshipdescription def link(self): - return '/explore/placescitationevents/%d/' % self.pk + return "/explore/placescitationevents/%d/" % self.pk def relationships(self): relationship_list = [] - relationship_list.append({'key': 'Place', 'value': [self.placeid.get_query_json()]}) - relationship_list.append({'key': 'Bibliographic Source', 'value': [self.citationid.get_query_json()]}) + relationship_list.append( + {"key": "Place", "value": [self.placeid.get_query_json()]} + ) + relationship_list.append( + {"key": "Bibliographic Source", "value": [self.citationid.get_query_json()]} + ) return relationship_list def data(self): return [ - {'key':'place', 'value': str(self.placeid)}, - {'key':'citation', 'value': str(self.citationid)}, - {'key':'relationship description', 'value': self.relationshipdescription}, - {'key':'pages', 'value': self.pages} + {"key": "place", "value": str(self.placeid)}, + {"key": "citation", "value": str(self.citationid)}, + {"key": "relationship description", "value": self.relationshipdescription}, + {"key": "pages", "value": self.pages}, ] def get_response_format(self): - type = 'Placescitationevents' - category_name = 'Place - Source' + type = "Placescitationevents" + category_name = "Place - Source" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': self.relationshipdescription, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": self.relationshipdescription, + "link": "/explore/%s/%d" % (type, self.pk), } def get_relationship_model(self, req_model): @@ -1621,78 +2335,142 @@ def get_relationship_model(self, req_model): else: return self.placeid + # Appears to be the version of AccessDB(s). Export gave 1 entry: [1,1,1] class CurrentVersion(models.Model): - id = models.AutoField(db_column='id', primary_key=True) - backendversion = models.IntegerField(db_column='backendversion', blank=True, null=True, verbose_name='backend version') - frontendversion = models.IntegerField(db_column='frontendversion', blank=True, null=True, verbose_name='frontend version') + id = models.AutoField(db_column="id", primary_key=True) + backendversion = models.IntegerField( + db_column="backendversion", + blank=True, + null=True, + verbose_name="backend version", + ) + frontendversion = models.IntegerField( + db_column="frontendversion", + blank=True, + null=True, + verbose_name="frontend version", + ) class Meta: managed = MANAGED - db_table = 'currentversion' - app_label = 'Lookup' - verbose_name = 'current version' - verbose_name_plural = 'current versions' + db_table = "currentversion" + app_label = "Lookup" + verbose_name = "current version" + verbose_name_plural = "current versions" def __unicode__(self): - return unicode("Back: %d, Front:%d" % (self.backendversion, self.frontendversion)) + return unicode( # noqa: F821 + "Back: %d, Front:%d" % (self.backendversion, self.frontendversion) + ) def __str__(self): - return "Back: %d, Front:%d" % (self.backendversion, self.frontendversion) or '' + return "Back: %d, Front:%d" % (self.backendversion, self.frontendversion) or "" + class LookupLocalityType(Lookup): - id = models.AutoField(db_column='id', primary_key=True) - localitytype = models.CharField(db_column='localitytype', max_length=255, verbose_name='locality type') + id = models.AutoField(db_column="id", primary_key=True) + localitytype = models.CharField( + db_column="localitytype", max_length=255, verbose_name="locality type" + ) class Meta: managed = MANAGED - ordering = ['localitytype'] - db_table = 'lookuplocalitytype' + ordering = ["localitytype"] + db_table = "lookuplocalitytype" app_label = "Lookup" verbose_name = "locality type" verbose_name_plural = "locality types" def __unicode__(self): - return unicode('%s' % (self.localitytype)) + return unicode("%s" % (self.localitytype)) # noqa: F821 def __str__(self): - return self.localitytype or '' + return self.localitytype or "" + class Locality(Queryable): - localityid = models.AutoField(db_column='localityid', primary_key=True) - placeid = models.ForeignKey(Places, db_column='placeid', blank=True, null=True, verbose_name='place', default=None, on_delete=models.SET_DEFAULT) - englishname = models.CharField(db_column='englishname', max_length=255, blank=True, null=True, verbose_name='english name') - indigenousname = models.CharField(db_column='indigenousname', max_length=255, blank=True, null=True, verbose_name='indigenous name') - localitytype = models.ForeignKey(LookupLocalityType, db_column='localitytype', max_length=255, blank=True, null=True, verbose_name='type', default=None, on_delete=models.SET_DEFAULT) + localityid = models.AutoField(db_column="localityid", primary_key=True) + placeid = models.ForeignKey( + Places, + db_column="placeid", + blank=True, + null=True, + verbose_name="place", + default=None, + on_delete=models.SET_DEFAULT, + ) + englishname = models.CharField( + db_column="englishname", + max_length=255, + blank=True, + null=True, + verbose_name="english name", + ) + indigenousname = models.CharField( + db_column="indigenousname", + max_length=255, + blank=True, + null=True, + verbose_name="indigenous name", + ) + localitytype = models.ForeignKey( + LookupLocalityType, + db_column="localitytype", + max_length=255, + blank=True, + null=True, + verbose_name="type", + default=None, + on_delete=models.SET_DEFAULT, + ) ### Updated Geometry Fields ### objects = GeoManager() geometry = GeometryField( - srid=3857, - null=True, blank=True, - verbose_name="Place Geometry", - default=None + srid=3857, null=True, blank=True, verbose_name="Place Geometry", default=None + ) + Source = models.CharField( + db_column="source", + max_length=255, + blank=True, + null=True, + default=None, + verbose_name="source", + ) + DigitizedBy = models.CharField( + db_column="digitizedby", + max_length=255, + blank=True, + null=True, + default=None, + verbose_name="digitized by", + ) + DigitizedDate = models.DateTimeField( + db_column="digitizeddate", + blank=True, + null=True, + auto_now_add=False, + default=None, + verbose_name="digitized date", ) - Source = models.CharField(db_column='source', max_length=255, blank=True, null=True, default=None, verbose_name='source') - DigitizedBy = models.CharField(db_column='digitizedby', max_length=255, blank=True, null=True, default=None, verbose_name='digitized by') - DigitizedDate = models.DateTimeField(db_column='digitizeddate', blank=True, null=True, auto_now_add=False, default=None, verbose_name='digitized date') class Meta: managed = MANAGED - db_table = 'locality' - verbose_name = 'Locality' - verbose_name_plural = 'Localities' + db_table = "locality" + verbose_name = "Locality" + verbose_name_plural = "Localities" def __unicode__(self): if self.englishname: - return unicode('%s' % (self.englishname)) + return unicode("%s" % (self.englishname)) # noqa: F821 else: - return unicode('Locality in %s' % (self.placeid.englishplacename)) + return unicode("Locality in %s" % (self.placeid.englishplacename)) # noqa: F821 def __str__(self): if self.englishname: - return self.englishname or '' + return self.englishname or "" else: - return ('Locality in %s' % (self.placeid.englishplacename)) or '' + return ("Locality in %s" % (self.placeid.englishplacename)) or "" def keyword_search(keyword): place_qs = Places.keyword_search(keyword) @@ -1702,32 +2480,38 @@ def keyword_search(keyword): locality_loi = [locality.pk for locality in locality_qs] return Locality.objects.filter( - Q(placeid__in=place_loi) | - Q(englishname__icontains=keyword) | - Q(indigenousname__icontains=keyword) | - Q(localitytype__in=locality_loi) + Q(placeid__in=place_loi) + | Q(englishname__icontains=keyword) + | Q(indigenousname__icontains=keyword) + | Q(localitytype__in=locality_loi) ) def image(self): - return settings.RECORD_ICONS['place'] + return settings.RECORD_ICONS["place"] def subtitle(self): return self.indigenousname def link(self): - return '/explore/locality/%d/' % self.pk + return "/explore/locality/%d/" % self.pk def relationships(self): relationship_list = [] places = [self.placeid.get_query_json()] if len(places) > 0: - relationship_list.append({'key': 'Place', 'value': places}) - placeresources = [x.get_query_json() for x in self.localityplaceresourceevents_set.all()] + relationship_list.append({"key": "Place", "value": places}) + placeresources = [ + x.get_query_json() for x in self.localityplaceresourceevents_set.all() + ] if len(placeresources) > 0: - relationship_list.append({'key': 'Place-resources', 'value': placeresources}) - gisselections = [x.get_query_json() for x in self.localitygisselections_set.all()] + relationship_list.append( + {"key": "Place-resources", "value": placeresources} + ) + gisselections = [ + x.get_query_json() for x in self.localitygisselections_set.all() + ] if len(gisselections) > 0: - relationship_list.append({'key': 'GIS Selections', 'value': gisselections}) + relationship_list.append({"key": "GIS Selections", "value": gisselections}) return relationship_list def map(self, srid=3857): @@ -1740,58 +2524,91 @@ def map(self, srid=3857): def data(self): return [ - {'key':'english name', 'value': self.englishname}, - {'key':'indigenous name', 'value': self.indigenousname}, - {'key':'place', 'value': str(self.placeid)}, - {'key':'locality type', 'value': str(self.localitytype)} + {"key": "english name", "value": self.englishname}, + {"key": "indigenous name", "value": self.indigenousname}, + {"key": "place", "value": str(self.placeid)}, + {"key": "locality type", "value": str(self.localitytype)}, ] def get_response_format(self): - type = 'locality' + type = "locality" category_name = "Locality" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': self.indigenousname, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": self.indigenousname, + "link": "/explore/%s/%d" % (type, self.pk), } + class LocalityGISSelections(models.Model): - localityid = models.ForeignKey(Locality, db_column='localityid', blank=True, null=True, verbose_name='locality', default=None, on_delete=models.SET_DEFAULT) - localitylabel = models.CharField(db_column='localitylabel', max_length=255, blank=True, null=True, verbose_name='locality label') - sourcefc = models.CharField(db_column='sourcefc', max_length=255, blank=True, null=True, verbose_name='source fc') + localityid = models.ForeignKey( + Locality, + db_column="localityid", + blank=True, + null=True, + verbose_name="locality", + default=None, + on_delete=models.SET_DEFAULT, + ) + localitylabel = models.CharField( + db_column="localitylabel", + max_length=255, + blank=True, + null=True, + verbose_name="locality label", + ) + sourcefc = models.CharField( + db_column="sourcefc", + max_length=255, + blank=True, + null=True, + verbose_name="source fc", + ) class Meta: managed = MANAGED - db_table = 'localitygisselections' - app_label = 'Relationships' - verbose_name_plural = 'Locality GIS Selections' + db_table = "localitygisselections" + app_label = "Relationships" + verbose_name_plural = "Locality GIS Selections" def __unicode__(self): - return unicode('%s' % (self.localitylabel)) + return unicode("%s" % (self.localitylabel)) # noqa: F821 def __str__(self): - return self.localitylabel or '' + return self.localitylabel or "" + class LocalityPlaceResourceEvent(Queryable): - placeresourceid = models.ForeignKey(PlacesResourceEvents, db_column='placeresourceid', primary_key=False, verbose_name='place resource', on_delete=models.PROTECT) - localityid = models.ForeignKey(Locality, db_column='localityid', verbose_name='locality', on_delete=models.PROTECT) + placeresourceid = models.ForeignKey( + PlacesResourceEvents, + db_column="placeresourceid", + primary_key=False, + verbose_name="place resource", + on_delete=models.PROTECT, + ) + localityid = models.ForeignKey( + Locality, + db_column="localityid", + verbose_name="locality", + on_delete=models.PROTECT, + ) class Meta: managed = MANAGED - db_table = 'localityplaceresourceevent' - unique_together = (('placeresourceid', 'localityid'),) - app_label = 'Relationships' - verbose_name_plural = 'Localities - Place-Resources' + db_table = "localityplaceresourceevent" + unique_together = (("placeresourceid", "localityid"),) + app_label = "Relationships" + verbose_name_plural = "Localities - Place-Resources" def __unicode__(self): - return unicode("%s - %s" % (str(self.localityid), str(self.placeresourceid))) + return unicode("%s - %s" % (str(self.localityid), str(self.placeresourceid))) # noqa: F821 def __str__(self): - return "%s - %s" % (str(self.localityid), str(self.placeresourceid)) or '' + return "%s - %s" % (str(self.localityid), str(self.placeresourceid)) or "" def keyword_search(keyword): locality_qs = Locality.keyword_search(keyword) @@ -1801,161 +2618,248 @@ def keyword_search(keyword): placeresource_loi = [placeresource.pk for placeresource in placeresource_qs] return LocalityPlaceResourceEvent.objects.filter( - Q(placeresourceid__in=placeresource_loi) | - Q(localityid__in=locality_loi) + Q(placeresourceid__in=placeresource_loi) | Q(localityid__in=locality_loi) ) def image(self): - return settings.RECORD_ICONS['activity'] + return settings.RECORD_ICONS["activity"] def subtitle(self): - return '' + return "" def link(self): - return '/explore/localityplaceresourceevent/%d/' % self.pk + return "/explore/localityplaceresourceevent/%d/" % self.pk def relationships(self): relationship_list = [] - relationship_list.append({'key': 'Place-Resource', 'value': [self.placeresourceid.get_query_json()]}) - relationship_list.append({'key': 'Locality', 'value': [self.localityid.get_query_json()]}) + relationship_list.append( + {"key": "Place-Resource", "value": [self.placeresourceid.get_query_json()]} + ) + relationship_list.append( + {"key": "Locality", "value": [self.localityid.get_query_json()]} + ) return relationship_list def data(self): return [ - {'key':'place', 'value': str(self.placeresourceid.placeid)}, - {'key':'resource', 'value': str(self.placeresourceid.resourceid)}, - {'key':'locality', 'value': str(self.localityid)} + {"key": "place", "value": str(self.placeresourceid.placeid)}, + {"key": "resource", "value": str(self.placeresourceid.resourceid)}, + {"key": "locality", "value": str(self.localityid)}, ] def get_response_format(self): - type = 'Placescitationevents' + type = "Placescitationevents" category_name = "Place - Source" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': 'locality place resource event', - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": "locality place resource event", + "link": "/explore/%s/%d" % (type, self.pk), } + class LookupMediaType(Lookup): - id = models.AutoField(db_column='id', primary_key=True) - mediatype = models.CharField(db_column='mediatype', max_length=255, verbose_name='type') - mediacategory = models.CharField(db_column='mediacategory', max_length=255, blank=True, null=True, verbose_name='category') + id = models.AutoField(db_column="id", primary_key=True) + mediatype = models.CharField( + db_column="mediatype", max_length=255, verbose_name="type" + ) + mediacategory = models.CharField( + db_column="mediacategory", + max_length=255, + blank=True, + null=True, + verbose_name="category", + ) class Meta: managed = MANAGED - ordering = ['mediatype'] - db_table = 'lookupmediatype' - app_label = 'Lookup' - verbose_name="media type" - verbose_name_plural="media types" + ordering = ["mediatype"] + db_table = "lookupmediatype" + app_label = "Lookup" + verbose_name = "media type" + verbose_name_plural = "media types" def __unicode__(self): - return unicode('%s' % (self.mediatype)) + return unicode("%s" % (self.mediatype)) # noqa: F821 def __str__(self): - return self.mediatype or '' + return self.mediatype or "" def keyword_search(keyword): return LookupMediaType.objects.filter( - Q(mediatype__icontains=keyword) | - Q(mediacategory__icontains=keyword) + Q(mediatype__icontains=keyword) | Q(mediacategory__icontains=keyword) ) + class LookupUserInfo(Lookup): - username = models.CharField(db_column='username', max_length=100, blank=True, null=True, verbose_name='username') - usingcustomusername = models.BooleanField(db_column='usingcustomusername', default=False, verbose_name='using custom username') - usertitle = models.CharField(db_column='usertitle', max_length=100, blank=True, null=True, verbose_name='title') - useraffiliation = models.CharField(db_column='useraffiliation', max_length=100, blank=True, null=True, verbose_name='affiliation') + username = models.CharField( + db_column="username", + max_length=100, + blank=True, + null=True, + verbose_name="username", + ) + usingcustomusername = models.BooleanField( + db_column="usingcustomusername", + default=False, + verbose_name="using custom username", + ) + usertitle = models.CharField( + db_column="usertitle", + max_length=100, + blank=True, + null=True, + verbose_name="title", + ) + useraffiliation = models.CharField( + db_column="useraffiliation", + max_length=100, + blank=True, + null=True, + verbose_name="affiliation", + ) class Meta: managed = MANAGED - ordering = ['username'] - db_table = 'lookupuserinfo' - app_label = 'Lookup' - verbose_name = 'user info' - verbose_name_plural = 'user info' + ordering = ["username"] + db_table = "lookupuserinfo" + app_label = "Lookup" + verbose_name = "user info" + verbose_name_plural = "user info" def __unicode__(self): - return unicode('%s' % (self.username)) + return unicode("%s" % (self.username)) # noqa: F821 def __str__(self): - return self.username or '' + return self.username or "" -# * Bulk Media Upload +# * Bulk Media Upload # formerly known as Media Collection class MediaBulkUpload(Reviewable, Queryable, Record, ModeratedModel): from datetime import date - # Default name for the media bulk upload - defaultmediabulkname = 'Bulk Upload on %s' % date.today() + # Default name for the media bulk upload + defaultmediabulkname = "Bulk Upload on %s" % date.today() - mediabulkname = models.CharField(max_length=255, blank=True, null=True, verbose_name='name', default=defaultmediabulkname) - mediabulkdate = models.DateField(blank=True, null=True, default=date.today, verbose_name='date') - mediabulkdescription = models.TextField(blank=True, null=True, verbose_name='description') + mediabulkname = models.CharField( + max_length=255, + blank=True, + null=True, + verbose_name="name", + default=defaultmediabulkname, + ) + mediabulkdate = models.DateField( + blank=True, null=True, default=date.today, verbose_name="date" + ) + mediabulkdescription = models.TextField( + blank=True, null=True, verbose_name="description" + ) - class Meta: managed = MANAGED - verbose_name = 'Media Bulk Upload' - verbose_name_plural = 'Media Bulk Uploads' + verbose_name = "Media Bulk Upload" + verbose_name_plural = "Media Bulk Uploads" def __str__(self): - return self.mediabulkname or '' + return self.mediabulkname or "" # @property # def count(self): - # number of media items uploaded + # number of media items uploaded # Ability to edit Media + class Media(Reviewable, Queryable, Record, ModeratedModel): - mediaid = models.AutoField(db_column='mediaid', primary_key=True) - mediatype = models.ForeignKey(LookupMediaType, db_column='mediatype', blank=True, null=True, verbose_name='type', default=None, on_delete=models.SET_DEFAULT) - medianame = models.CharField(db_column='medianame', max_length=255, blank=True, null=True, verbose_name='name') - mediadescription = HTMLField(db_column='mediadescription', blank=True, null=True, verbose_name='description') - medialink = models.CharField(db_column='medialink', max_length=255, blank=True, null=True, verbose_name='historic location') - mediafile = models.FileField(db_column='mediafile', max_length=255, blank=True, null=True, verbose_name='file') - limitedaccess = models.BooleanField(db_column='limitedaccess', null=True, default=False, verbose_name='limited access?') + mediaid = models.AutoField(db_column="mediaid", primary_key=True) + mediatype = models.ForeignKey( + LookupMediaType, + db_column="mediatype", + blank=True, + null=True, + verbose_name="type", + default=None, + on_delete=models.SET_DEFAULT, + ) + medianame = models.CharField( + db_column="medianame", + max_length=255, + blank=True, + null=True, + verbose_name="name", + ) + mediadescription = HTMLField( + db_column="mediadescription", blank=True, null=True, verbose_name="description" + ) + medialink = models.CharField( + db_column="medialink", + max_length=255, + blank=True, + null=True, + verbose_name="historic location", + ) + mediafile = models.FileField( + db_column="mediafile", + max_length=255, + blank=True, + null=True, + verbose_name="file", + ) + limitedaccess = models.BooleanField( + db_column="limitedaccess", + null=True, + default=False, + verbose_name="limited access?", + ) # * Media Bulk Upload Event - mediabulkupload = models.ForeignKey(MediaBulkUpload, related_name='mediabulkupload', blank=True, null=True, on_delete=models.CASCADE) + mediabulkupload = models.ForeignKey( + MediaBulkUpload, + related_name="mediabulkupload", + blank=True, + null=True, + on_delete=models.CASCADE, + ) class Meta: managed = MANAGED - db_table = 'media' - verbose_name = 'Medium' - verbose_name_plural = 'Media' + db_table = "media" + verbose_name = "Medium" + verbose_name_plural = "Media" def __unicode__(self): - return unicode('%s' % (self.medianame)) + return unicode("%s" % (self.medianame)) # noqa: F821 def __str__(self): - return "%s [ %s ]" % (self.medianame, self.mediatype) or '' + return "%s [ %s ]" % (self.medianame, self.mediatype) or "" def keyword_search( - keyword, # string - fields=['medianame','mediadescription','medialink','mediafile'], # fields to search - fk_fields=[ - ('mediatype','mediatype') - ] # fields to search for fk objects - ): - + keyword, # string + fields=[ + "medianame", + "mediadescription", + "medialink", + "mediafile", + ], # fields to search + fk_fields=[("mediatype", "mediatype")], # fields to search for fk objects + ): weight_lookup = { - 'medianame': 'A', - 'mediadescription': 'B', - 'medialink': 'B', - 'mediafile': 'B', - 'mediatype': 'C' + "medianame": "A", + "mediadescription": "B", + "medialink": "B", + "mediafile": "B", + "mediatype": "C", } - sort_field = 'medianame' + sort_field = "medianame" - return run_keyword_search(Media, keyword, fields, fk_fields, weight_lookup, sort_field) + return run_keyword_search( + Media, keyword, fields, fk_fields, weight_lookup, sort_field + ) # def keyword_search(keyword): # type_qs = LookupMediaType.keyword_search(keyword) @@ -1971,95 +2875,123 @@ def keyword_search( def description_text(self): from django.utils.html import strip_tags from html import unescape + return unescape(strip_tags(self.mediadescription)) def image(self): - return settings.RECORD_ICONS['media'] + return settings.RECORD_ICONS["media"] def subtitle(self): return self.mediatype def link(self): - return '/explore/media/%d/' % self.pk + return "/explore/media/%d/" % self.pk def relationships(self): relationship_list = [] - places = [x.get_relationship_json(type(self)) for x in self.placesmediaevents_set.all()] + places = [ + x.get_relationship_json(type(self)) + for x in self.placesmediaevents_set.all() + ] if len(places) > 0: - relationship_list.append({'key': 'Places', 'value': places}) - resources = [x.get_relationship_json(type(self)) for x in self.resourcesmediaevents_set.all()] + relationship_list.append({"key": "Places", "value": places}) + resources = [ + x.get_relationship_json(type(self)) + for x in self.resourcesmediaevents_set.all() + ] if len(resources) > 0: - relationship_list.append({'key': 'Resources', 'value': resources}) - citations = [x.get_relationship_json(type(self)) for x in self.mediacitationevents_set.all()] + relationship_list.append({"key": "Resources", "value": resources}) + citations = [ + x.get_relationship_json(type(self)) + for x in self.mediacitationevents_set.all() + ] if len(citations) > 0: - relationship_list.append({'key': 'Bibliographic Sources', 'value': citations}) - activities = [x.get_relationship_json(type(self)) for x in self.resourceactivitymediaevents_set.all()] + relationship_list.append( + {"key": "Bibliographic Sources", "value": citations} + ) + activities = [ + x.get_relationship_json(type(self)) + for x in self.resourceactivitymediaevents_set.all() + ] if len(activities) > 0: - relationship_list.append({'key': 'Activities', 'value': activities}) - placeresources = [x.get_relationship_json(type(self)) for x in self.placesresourcemediaevents_set.all()] + relationship_list.append({"key": "Activities", "value": activities}) + placeresources = [ + x.get_relationship_json(type(self)) + for x in self.placesresourcemediaevents_set.all() + ] if len(placeresources) > 0: - relationship_list.append({'key': 'Place-Resources', 'value': placeresources}) + relationship_list.append( + {"key": "Place-Resources", "value": placeresources} + ) return relationship_list def restrict_data(self, user): - if self.limitedaccess and user.accesslevel.accesslevel not in ['Administrator', 'Editor']: + if self.limitedaccess and user.accesslevel.accesslevel not in [ + "Administrator", + "Editor", + ]: return True else: return False def limited_data(self): - if self.mediafile == None: - mediafile = 'None' + if self.mediafile is None: + mediafile = "None" else: mediafile = "Please ask an administrator if you need access to this file." return [ - {'key':'name', 'value': self.medianame}, - {'key':'media type', 'value': str(self.mediatype)}, - {'key':'media description', 'value': self.mediadescription}, - {'key':'file', 'value': mediafile}, + {"key": "name", "value": self.medianame}, + {"key": "media type", "value": str(self.mediatype)}, + {"key": "media description", "value": self.mediadescription}, + {"key": "file", "value": mediafile}, ] def media(self): - if not self.medialink == None or not self.mediafile == None: + if self.medialink is not None or self.mediafile is not None: return { - 'file': str(self.mediafile), - 'type': str(self.mediatype), + "file": str(self.mediafile), + "type": str(self.mediatype), } else: return False def data(self): from TEKDB.settings import MEDIA_URL - if self.mediafile == None: - mediafile = 'None' + + if self.mediafile is None: + mediafile = "None" else: - mediafile = "%s" % (MEDIA_URL, str(self.mediafile), str(self.mediafile)) + mediafile = "%s" % ( + MEDIA_URL, + str(self.mediafile), + str(self.mediafile), + ) return [ - {'key':'name', 'value': self.medianame}, - {'key':'media type', 'value': str(self.mediatype)}, - {'key':'media description', 'value': self.mediadescription}, + {"key": "name", "value": self.medianame}, + {"key": "media type", "value": str(self.mediatype)}, + {"key": "media description", "value": self.mediadescription}, # {'key':'link', 'value': self.medialink}, - {'key':'file', 'value': mediafile}, + {"key": "file", "value": mediafile}, ] def get_response_format(self): - type = 'media' - category_name = 'Media' + type = "media" + category_name = "Media" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': self.mediadescription, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": self.mediadescription, + "link": "/explore/%s/%d" % (type, self.pk), } def get_record_dict(self, user, srid=3857): record_dict = super(Media, self).get_record_dict(user, srid) - record_dict['name'] = self.medianame + record_dict["name"] = self.medianame return record_dict __original_file = None @@ -2070,6 +3002,7 @@ def __init__(self, *args, **kwargs): def save(self, *args, **kwargs): import os + # Detect if mediafile field changed if self.mediafile != self.__original_file: if self.medialink and os.path.exists(self.medialink): @@ -2095,43 +3028,77 @@ def get_related_objects(self, object_id): place_res_events = self.placesresourcemediaevents_set.all() activity_events = self.resourceactivitymediaevents_set.all() return [ - {'title': 'Place Relationships', 'data': self.format_data(place_events, 'mediaid', ['media'])}, - {'title': 'Citation Relationships', 'data': self.format_data(citation_events, 'mediaid', ['media'])}, - {'title': 'Resource Relationships', 'data': self.format_data(resource_events, 'mediaid', ['media'])}, - {'title': 'Place-Resource Relationships', 'data': self.format_data(place_res_events, 'mediaid', ['media'])}, - {'title': 'Activity Relationships', 'data': self.format_data(activity_events, 'mediaid', ['media'])}, + { + "title": "Place Relationships", + "data": self.format_data(place_events, "mediaid", ["media"]), + }, + { + "title": "Citation Relationships", + "data": self.format_data(citation_events, "mediaid", ["media"]), + }, + { + "title": "Resource Relationships", + "data": self.format_data(resource_events, "mediaid", ["media"]), + }, + { + "title": "Place-Resource Relationships", + "data": self.format_data(place_res_events, "mediaid", ["media"]), + }, + { + "title": "Activity Relationships", + "data": self.format_data(activity_events, "mediaid", ["media"]), + }, ] + # Signal handler to delete the associated media file when a Media instance is deleted @receiver(post_delete, sender=Media) def delete_mediafile(sender, instance, **kwargs): if instance.mediafile and os.path.isfile(instance.mediafile.path): os.remove(instance.mediafile.path) + class MediaCitationEvents(SimpleRelationship): - mediaid = models.ForeignKey(Media, db_column='mediaid', primary_key=False, verbose_name='media', on_delete=models.CASCADE) - citationid = models.ForeignKey(Citations, db_column='citationid', verbose_name='citation', on_delete=models.CASCADE) - relationshipdescription = HTMLField(db_column='relationshipdescription', blank=True, null=True, verbose_name='excerpt/description') - pages = models.CharField(db_column='pages', max_length=255, blank=True, null=True) + mediaid = models.ForeignKey( + Media, + db_column="mediaid", + primary_key=False, + verbose_name="media", + on_delete=models.CASCADE, + ) + citationid = models.ForeignKey( + Citations, + db_column="citationid", + verbose_name="citation", + on_delete=models.CASCADE, + ) + relationshipdescription = HTMLField( + db_column="relationshipdescription", + blank=True, + null=True, + verbose_name="excerpt/description", + ) + pages = models.CharField(db_column="pages", max_length=255, blank=True, null=True) class Meta: managed = MANAGED - db_table = 'mediacitationevents' - app_label = 'Relationships' - verbose_name = 'Medium - Source' - verbose_name_plural = 'Media - Sources' - unique_together = (('mediaid', 'citationid'),) + db_table = "mediacitationevents" + app_label = "Relationships" + verbose_name = "Medium - Source" + verbose_name_plural = "Media - Sources" + unique_together = (("mediaid", "citationid"),) def __unicode__(self): - return unicode("%s %s" % (str(self.mediaid), str(self.citationid))) + return unicode("%s %s" % (str(self.mediaid), str(self.citationid))) # noqa: F821 def __str__(self): - return "%s %s" % (str(self.mediaid), str(self.citationid)) or '' + return "%s %s" % (str(self.mediaid), str(self.citationid)) or "" @property def description_text(self): from django.utils.html import strip_tags from html import unescape + return unescape(strip_tags(self.relationshipdescription)) def keyword_search(keyword): @@ -2142,45 +3109,49 @@ def keyword_search(keyword): citation_loi = [citation.pk for citation in citation_qs] return MediaCitationEvents.objects.filter( - Q(citationid__in=citation_loi) | - Q(mediaid__in=media_loi) | - Q(relationshipdescription__icontains=keyword) + Q(citationid__in=citation_loi) + | Q(mediaid__in=media_loi) + | Q(relationshipdescription__icontains=keyword) ) def image(self): - return settings.RECORD_ICONS['activity'] + return settings.RECORD_ICONS["activity"] def subtitle(self): return self.relationshipdescription def link(self): - return '/explore/mediacitationevents/%d/' % self.pk + return "/explore/mediacitationevents/%d/" % self.pk def relationships(self): relationship_list = [] - relationship_list.append({'key':'Media','value':[self.mediaid.get_query_json()]}) - relationship_list.append({'key':'Bibliographic Source','value':[self.citationid.get_query_json()]}) + relationship_list.append( + {"key": "Media", "value": [self.mediaid.get_query_json()]} + ) + relationship_list.append( + {"key": "Bibliographic Source", "value": [self.citationid.get_query_json()]} + ) return relationship_list def data(self): return [ - {'key':'media', 'value': str(self.mediaid)}, - {'key':'citation', 'value': str(self.citationid)}, - {'key':'relationship description', 'value': self.relationshipdescription}, - {'key':'pages', 'value': self.pages} + {"key": "media", "value": str(self.mediaid)}, + {"key": "citation", "value": str(self.citationid)}, + {"key": "relationship description", "value": self.relationshipdescription}, + {"key": "pages", "value": self.pages}, ] def get_response_format(self): - type = 'Mediacitationevents' - category_name = 'Media - Sources' + type = "Mediacitationevents" + category_name = "Media - Sources" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': self.relationshipdescription, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": self.relationshipdescription, + "link": "/explore/%s/%d" % (type, self.pk), } def get_relationship_model(self, req_model): @@ -2189,73 +3160,122 @@ def get_relationship_model(self, req_model): else: return self.mediaid -#Unsure why this is not a 'SimpleRelationship' + +# Unsure why this is not a 'SimpleRelationship' class PlaceAltIndigenousName(DefaultModel, DefaultModeratedModel, ModeratedModel): - altindigenousnameid = models.AutoField(db_column='altindigenousnameid', primary_key=True) - placeid = models.ForeignKey(Places, db_column='placeid', blank=True, null=True, verbose_name='place', default=None, on_delete=models.SET_DEFAULT) - altindigenousname = models.CharField(db_column='altindigenousname', max_length=255, blank=True, null=True, verbose_name='alternate name') + altindigenousnameid = models.AutoField( + db_column="altindigenousnameid", primary_key=True + ) + placeid = models.ForeignKey( + Places, + db_column="placeid", + blank=True, + null=True, + verbose_name="place", + default=None, + on_delete=models.SET_DEFAULT, + ) + altindigenousname = models.CharField( + db_column="altindigenousname", + max_length=255, + blank=True, + null=True, + verbose_name="alternate name", + ) class Meta: managed = MANAGED - db_table = 'placealtindigenousname' - verbose_name = 'Place - Alternate Name' - verbose_name_plural = 'Places - Alternate Names' - app_label = 'Relationships' + db_table = "placealtindigenousname" + verbose_name = "Place - Alternate Name" + verbose_name_plural = "Places - Alternate Names" + app_label = "Relationships" def get_query_json(self): - return { - 'name': str(self), - 'link': False - } + return {"name": str(self), "link": False} def __unicode__(self): - return unicode('%s' % (self.altindigenousname)) + return unicode("%s" % (self.altindigenousname)) # noqa: F821 def __str__(self): - return self.altindigenousname or '' + return self.altindigenousname or "" def data(self): return [ - {'key':'place', 'value': str(self.placeid)}, - {'key':'alternate name', 'value':str(self.altindigenousname)}, + {"key": "place", "value": str(self.placeid)}, + {"key": "alternate name", "value": str(self.altindigenousname)}, ] + class PlaceGISSelections(models.Model): - placeid = models.ForeignKey(Places, db_column='placeid', blank=True, null=True, verbose_name='place', default=None, on_delete=models.SET_DEFAULT) - placelabel = models.CharField(db_column='placelabel', max_length=255, blank=True, null=True, verbose_name='label') - sourcefc = models.CharField(db_column='sourcefc', max_length=255, blank=True, null=True, verbose_name='source fc') + placeid = models.ForeignKey( + Places, + db_column="placeid", + blank=True, + null=True, + verbose_name="place", + default=None, + on_delete=models.SET_DEFAULT, + ) + placelabel = models.CharField( + db_column="placelabel", + max_length=255, + blank=True, + null=True, + verbose_name="label", + ) + sourcefc = models.CharField( + db_column="sourcefc", + max_length=255, + blank=True, + null=True, + verbose_name="source fc", + ) class Meta: managed = MANAGED - db_table = 'placegisselections' - app_label = 'Relationships' - verbose_name_plural = 'Place GIS Selections' + db_table = "placegisselections" + app_label = "Relationships" + verbose_name_plural = "Place GIS Selections" def __unicode__(self): - return unicode('%s' % (self.placelabel)) + return unicode("%s" % (self.placelabel)) # noqa: F821 def __str__(self): - return self.placelabel or '' + return self.placelabel or "" + class PlacesMediaEvents(SimpleRelationship): - placeid = models.ForeignKey(Places, db_column='placeid', primary_key=False, verbose_name='place', on_delete=models.CASCADE) - mediaid = models.ForeignKey(Media, db_column='mediaid', verbose_name='media', on_delete=models.CASCADE) - relationshipdescription = HTMLField(db_column='relationshipdescription', blank=True, null=True, verbose_name='relationship description') - pages = models.CharField(db_column='pages', max_length=50, blank=True, null=True) + placeid = models.ForeignKey( + Places, + db_column="placeid", + primary_key=False, + verbose_name="place", + on_delete=models.CASCADE, + ) + mediaid = models.ForeignKey( + Media, db_column="mediaid", verbose_name="media", on_delete=models.CASCADE + ) + relationshipdescription = HTMLField( + db_column="relationshipdescription", + blank=True, + null=True, + verbose_name="relationship description", + ) + pages = models.CharField(db_column="pages", max_length=50, blank=True, null=True) class Meta: managed = MANAGED - db_table = 'placesmediaevents' - verbose_name = 'Place - Medium' - app_label = 'Relationships' - verbose_name_plural = 'Places - Media' - unique_together = (('placeid', 'mediaid'),) + db_table = "placesmediaevents" + verbose_name = "Place - Medium" + app_label = "Relationships" + verbose_name_plural = "Places - Media" + unique_together = (("placeid", "mediaid"),) def __unicode__(self): - return unicode("%s %s" % (str(self.placeid), str(self.mediaid))) + return unicode("%s %s" % (str(self.placeid), str(self.mediaid))) # noqa: F821 def __str__(self): - return "%s %s" % (str(self.placeid), str(self.mediaid)) or '' + return "%s %s" % (str(self.placeid), str(self.mediaid)) or "" def keyword_search(keyword): place_qs = Places.keyword_search(keyword) @@ -2265,45 +3285,49 @@ def keyword_search(keyword): media_loi = [media.pk for media in media_qs] return PlacesMediaEvents.objects.filter( - Q(placeid__in=place_loi) | - Q(mediaid__in=media_loi) | - Q(relationshipdescription__icontains=keyword) + Q(placeid__in=place_loi) + | Q(mediaid__in=media_loi) + | Q(relationshipdescription__icontains=keyword) ) def image(self): - return settings.RECORD_ICONS['activity'] + return settings.RECORD_ICONS["activity"] def subtitle(self): return self.relationshipdescription def link(self): - return '/explore/placesmediaevents/%s' % self.pk + return "/explore/placesmediaevents/%s" % self.pk def relationships(self): relationship_list = [] - relationship_list.append({'key':'Place', 'value':[self.placeid.get_query_json()]}) - relationship_list.append({'key':'Media', 'value':[self.mediaid.get_query_json()]}) + relationship_list.append( + {"key": "Place", "value": [self.placeid.get_query_json()]} + ) + relationship_list.append( + {"key": "Media", "value": [self.mediaid.get_query_json()]} + ) return relationship_list def data(self): return [ - {'key':'place', 'value': str(self.placeid)}, - {'key':'media', 'value': str(self.mediaid)}, - {'key':'relationship description', 'value': self.relationshipdescription}, - {'key':'pages', 'value': self.pages} + {"key": "place", "value": str(self.placeid)}, + {"key": "media", "value": str(self.mediaid)}, + {"key": "relationship description", "value": self.relationshipdescription}, + {"key": "pages", "value": self.pages}, ] def get_response_format(self): - type = 'Placesmediaevents' + type = "Placesmediaevents" category_name = "Place - Media" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': self.relationshipdescription, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": self.relationshipdescription, + "link": "/explore/%s/%d" % (type, self.pk), } def get_relationship_model(self, req_model): @@ -2312,24 +3336,41 @@ def get_relationship_model(self, req_model): else: return self.mediaid + class PlacesResourceCitationEvents(SimpleRelationship): - placeresourceid = models.ForeignKey(PlacesResourceEvents, db_column='placeresourceid', primary_key=False, verbose_name='place resource', on_delete=models.CASCADE) - citationid = models.ForeignKey(Citations, db_column='citationid', verbose_name='citation', on_delete=models.CASCADE) - relationshipdescription = HTMLField(db_column='relationshipdescription', blank=True, null=True, verbose_name='excerpt/description') - pages = models.CharField(db_column='pages', max_length=255, blank=True, null=True) + placeresourceid = models.ForeignKey( + PlacesResourceEvents, + db_column="placeresourceid", + primary_key=False, + verbose_name="place resource", + on_delete=models.CASCADE, + ) + citationid = models.ForeignKey( + Citations, + db_column="citationid", + verbose_name="citation", + on_delete=models.CASCADE, + ) + relationshipdescription = HTMLField( + db_column="relationshipdescription", + blank=True, + null=True, + verbose_name="excerpt/description", + ) + pages = models.CharField(db_column="pages", max_length=255, blank=True, null=True) class Meta: managed = MANAGED - db_table = 'placesresourcecitationevents' - unique_together = (('placeresourceid', 'citationid'),) - app_label = 'Relationships' - verbose_name_plural = 'Place-Resources - Sources' + db_table = "placesresourcecitationevents" + unique_together = (("placeresourceid", "citationid"),) + app_label = "Relationships" + verbose_name_plural = "Place-Resources - Sources" def __unicode__(self): - return unicode("%s %s" % (str(self.placeresourceid), str(self.citationid))) + return unicode("%s %s" % (str(self.placeresourceid), str(self.citationid))) # noqa: F821 def __str__(self): - return "%s %s" % (str(self.placeresourceid), str(self.citationid)) or '' + return "%s %s" % (str(self.placeresourceid), str(self.citationid)) or "" def keyword_search(keyword): placeresource_qs = PlacesResourceEvents.keyword_search(keyword) @@ -2339,46 +3380,50 @@ def keyword_search(keyword): citation_loi = [citation.pk for citation in citation_qs] return PlacesResourceCitationEvents.objects.filter( - Q(citationid__in=citation_loi) | - Q(placeresourceid__in=placeresource_loi) | - Q(relationshipdescription__icontains=keyword) + Q(citationid__in=citation_loi) + | Q(placeresourceid__in=placeresource_loi) + | Q(relationshipdescription__icontains=keyword) ) def image(self): - return settings.RECORD_ICONS['activity'] + return settings.RECORD_ICONS["activity"] def subtitle(self): return self.relationshipdescription def link(self): - return '/explore/placesresourcecitationevents/%d/' % self.pk + return "/explore/placesresourcecitationevents/%d/" % self.pk def relationships(self): relationship_list = [] - relationship_list.append({'key':'Place-Resource', 'value':[self.placeresourceid.get_query_json()]}) - relationship_list.append({'key':'Bibliographic Source', 'value':[self.citationid.get_query_json()]}) + relationship_list.append( + {"key": "Place-Resource", "value": [self.placeresourceid.get_query_json()]} + ) + relationship_list.append( + {"key": "Bibliographic Source", "value": [self.citationid.get_query_json()]} + ) return relationship_list def data(self): return [ - {'key':'place', 'value': str(self.placeresourceid.placeid)}, - {'key':'resource', 'value': str(self.placeresourceid.resourceid)}, - {'key':'citation', 'value': str(self.citationid)}, - {'key':'relationship description', 'value': self.relationshipdescription}, - {'key':'pages', 'value': self.pages} + {"key": "place", "value": str(self.placeresourceid.placeid)}, + {"key": "resource", "value": str(self.placeresourceid.resourceid)}, + {"key": "citation", "value": str(self.citationid)}, + {"key": "relationship description", "value": self.relationshipdescription}, + {"key": "pages", "value": self.pages}, ] def get_response_format(self): - type = 'Placesresourcecitationevents' - category_name = 'Place/Resource - Sources' + type = "Placesresourcecitationevents" + category_name = "Place/Resource - Sources" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': self.relationshipdescription, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": self.relationshipdescription, + "link": "/explore/%s/%d" % (type, self.pk), } def get_relationship_model(self, req_model): @@ -2387,24 +3432,38 @@ def get_relationship_model(self, req_model): else: return self.placeresourceid + class PlacesResourceMediaEvents(SimpleRelationship): - placeresourceid = models.ForeignKey(PlacesResourceEvents, db_column='placeresourceid', primary_key=False, verbose_name='place - resource', on_delete=models.CASCADE) - mediaid = models.ForeignKey(Media, db_column='mediaid', verbose_name='media', on_delete=models.CASCADE) - relationshipdescription = HTMLField(db_column='relationshipdescription', blank=True, null=True, verbose_name='relationship description') - pages = models.CharField(db_column='pages', max_length=50, blank=True, null=True) + placeresourceid = models.ForeignKey( + PlacesResourceEvents, + db_column="placeresourceid", + primary_key=False, + verbose_name="place - resource", + on_delete=models.CASCADE, + ) + mediaid = models.ForeignKey( + Media, db_column="mediaid", verbose_name="media", on_delete=models.CASCADE + ) + relationshipdescription = HTMLField( + db_column="relationshipdescription", + blank=True, + null=True, + verbose_name="relationship description", + ) + pages = models.CharField(db_column="pages", max_length=50, blank=True, null=True) class Meta: managed = MANAGED - db_table = 'placesresourcemediaevents' - unique_together = (('placeresourceid', 'mediaid'),) + db_table = "placesresourcemediaevents" + unique_together = (("placeresourceid", "mediaid"),) app_label = "Relationships" verbose_name_plural = "Place-Resources - Media" def __unicode__(self): - return unicode("%s %s" % (str(self.placeresourceid), str(self.mediaid))) + return unicode("%s %s" % (str(self.placeresourceid), str(self.mediaid))) # noqa: F821 def __str__(self): - return "%s %s" % (str(self.placeresourceid), str(self.mediaid)) or '' + return "%s %s" % (str(self.placeresourceid), str(self.mediaid)) or "" def keyword_search(keyword): placeresource_qs = PlacesResourceEvents.keyword_search(keyword) @@ -2414,45 +3473,49 @@ def keyword_search(keyword): media_loi = [media.pk for media in media_qs] return PlacesResourceMediaEvents.objects.filter( - Q(placeresourceid__in=placeresource_loi) | - Q(mediaid__in=media_loi) | - Q(relationshipdescription__icontains=keyword) + Q(placeresourceid__in=placeresource_loi) + | Q(mediaid__in=media_loi) + | Q(relationshipdescription__icontains=keyword) ) def image(self): - return settings.RECORD_ICONS['activity'] + return settings.RECORD_ICONS["activity"] def subtitle(self): return self.relationshipdescription def link(self): - return '/explore/placesresourcemediaevents/%d/' % self.pk + return "/explore/placesresourcemediaevents/%d/" % self.pk def relationships(self): relationship_list = [] - relationship_list.append({'key':'Place-Resource', 'value':[self.placeresourceid.get_query_json()]}) - relationship_list.append({'key':'Media', 'value':[self.mediaid.get_query_json()]}) + relationship_list.append( + {"key": "Place-Resource", "value": [self.placeresourceid.get_query_json()]} + ) + relationship_list.append( + {"key": "Media", "value": [self.mediaid.get_query_json()]} + ) return relationship_list def data(self): return [ - {'key':'place', 'value': str(self.placeresourceid.placeid)}, - {'key':'resource', 'value': str(self.placeresourceid.resourceid)}, - {'key':'media', 'value': str(self.mediaid)}, - {'key':'relationship description', 'value': self.relationshipdescription} + {"key": "place", "value": str(self.placeresourceid.placeid)}, + {"key": "resource", "value": str(self.placeresourceid.resourceid)}, + {"key": "media", "value": str(self.mediaid)}, + {"key": "relationship description", "value": self.relationshipdescription}, ] def get_response_format(self): - type = 'Placesresourcemediaevents' + type = "Placesresourcemediaevents" category_name = "Place/Resource - Media" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': self.relationshipdescription, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": self.relationshipdescription, + "link": "/explore/%s/%d" % (type, self.pk), } def get_relationship_model(self, req_model): @@ -2461,73 +3524,95 @@ def get_relationship_model(self, req_model): else: return self.placeresourceid + class ResourceActivityCitationEvents(SimpleRelationship): - resourceactivityid = models.ForeignKey(ResourcesActivityEvents, db_column='resourceactivityid', primary_key=False, verbose_name='resource activity', on_delete=models.CASCADE) - citationid = models.ForeignKey(Citations, db_column='citationid', verbose_name='citation', on_delete=models.CASCADE) - relationshipdescription = HTMLField(db_column='relationshipdescription', blank=True, null=True, verbose_name='excerpt/description') - pages = models.CharField(db_column='pages', max_length=255, blank=True, null=True) + resourceactivityid = models.ForeignKey( + ResourcesActivityEvents, + db_column="resourceactivityid", + primary_key=False, + verbose_name="resource activity", + on_delete=models.CASCADE, + ) + citationid = models.ForeignKey( + Citations, + db_column="citationid", + verbose_name="citation", + on_delete=models.CASCADE, + ) + relationshipdescription = HTMLField( + db_column="relationshipdescription", + blank=True, + null=True, + verbose_name="excerpt/description", + ) + pages = models.CharField(db_column="pages", max_length=255, blank=True, null=True) class Meta: managed = MANAGED - db_table = 'resourceactivitycitationevents' - unique_together = (('resourceactivityid', 'citationid'),) - app_label = 'Relationships' - verbose_name_plural = 'Activity - Sources' + db_table = "resourceactivitycitationevents" + unique_together = (("resourceactivityid", "citationid"),) + app_label = "Relationships" + verbose_name_plural = "Activity - Sources" def __unicode__(self): - return unicode("%s %s" % (str(self.resourceactivityid), str(self.citationid))) + return unicode("%s %s" % (str(self.resourceactivityid), str(self.citationid))) # noqa: F821 def __str__(self): - return "%s %s" % (str(self.resourceactivityid), str(self.citationid)) or '' + return "%s %s" % (str(self.resourceactivityid), str(self.citationid)) or "" def keyword_search(keyword): resourceactivity_qs = ResourcesActivityEvents.keyword_search(keyword) - resourceactivity_loi = [resourceactivity.pk for resourceactivity in resourceactivity_qs] + resourceactivity_loi = [ + resourceactivity.pk for resourceactivity in resourceactivity_qs + ] citation_qs = Citations.keyword_search(keyword) citation_loi = [citation.pk for citation in citation_qs] return ResourceActivityCitationEvents.objects.filter( - Q(citationid__in=citation_loi) | - Q(resourceactivityid__in=resourceactivity_loi) | - Q(relationshipdescription__icontains=keyword) + Q(citationid__in=citation_loi) + | Q(resourceactivityid__in=resourceactivity_loi) + | Q(relationshipdescription__icontains=keyword) ) def image(self): - return settings.RECORD_ICONS['activity'] + return settings.RECORD_ICONS["activity"] def subtitle(self): return self.relationshipdescription def link(self): - return '/explore/resourceactivitycitationevents/%d/' % self.pk + return "/explore/resourceactivitycitationevents/%d/" % self.pk def relationships(self): relationship_list = [] - relationship_list.append({'key':'Activity', 'value':[self.resourceactivityid.get_query_json()]}) - relationship_list.append({'key':'Bibliographic Source', 'value':[self.citationid.get_query_json()]}) + relationship_list.append( + {"key": "Activity", "value": [self.resourceactivityid.get_query_json()]} + ) + relationship_list.append( + {"key": "Bibliographic Source", "value": [self.citationid.get_query_json()]} + ) return relationship_list def data(self): return [ - {'key':'resource activity', 'value': str(self.resourceactivityid)}, - {'key':'citation', 'value': str(self.citationid)}, - {'key':'relationship description', 'value': self.relationshipdescription}, - {'key':'pages', 'value': self.pages} - + {"key": "resource activity", "value": str(self.resourceactivityid)}, + {"key": "citation", "value": str(self.citationid)}, + {"key": "relationship description", "value": self.relationshipdescription}, + {"key": "pages", "value": self.pages}, ] def get_response_format(self): - type = 'Resourceactivitycitationevents' - category_name = 'Activity - Source' + type = "Resourceactivitycitationevents" + category_name = "Activity - Source" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': self.relationshipdescription, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": self.relationshipdescription, + "link": "/explore/%s/%d" % (type, self.pk), } def get_relationship_model(self, req_model): @@ -2536,75 +3621,95 @@ def get_relationship_model(self, req_model): else: return self.resourceactivityid + class ResourceActivityMediaEvents(SimpleRelationship): - resourceactivityid = models.ForeignKey(ResourcesActivityEvents, db_column='resourceactivityid', primary_key=False, verbose_name='resource activity', on_delete=models.CASCADE) - mediaid = models.ForeignKey(Media, db_column='mediaid', verbose_name='media', on_delete=models.CASCADE) - relationshipdescription = HTMLField(db_column='relationshipdescription', blank=True, null=True, verbose_name='relationship description') - pages = models.CharField(db_column='pages', max_length=50, blank=True, null=True) + resourceactivityid = models.ForeignKey( + ResourcesActivityEvents, + db_column="resourceactivityid", + primary_key=False, + verbose_name="resource activity", + on_delete=models.CASCADE, + ) + mediaid = models.ForeignKey( + Media, db_column="mediaid", verbose_name="media", on_delete=models.CASCADE + ) + relationshipdescription = HTMLField( + db_column="relationshipdescription", + blank=True, + null=True, + verbose_name="relationship description", + ) + pages = models.CharField(db_column="pages", max_length=50, blank=True, null=True) class Meta: managed = MANAGED - db_table = 'resourceactivitymediaevents' - unique_together = (('resourceactivityid', 'mediaid'),) - app_label = 'Relationships' - verbose_name_plural = 'Activity - Media' + db_table = "resourceactivitymediaevents" + unique_together = (("resourceactivityid", "mediaid"),) + app_label = "Relationships" + verbose_name_plural = "Activity - Media" def __unicode__(self): - return unicode("%s %s" % (str(self.resourceactivityid), str(self.mediaid))) + return unicode("%s %s" % (str(self.resourceactivityid), str(self.mediaid))) # noqa: F821 def __str__(self): - return "%s %s" % (str(self.resourceactivityid), str(self.mediaid)) or '' + return "%s %s" % (str(self.resourceactivityid), str(self.mediaid)) or "" def keyword_search(keyword): resourceactivity_qs = ResourcesActivityEvents.keyword_search(keyword) - resourceactivity_loi = [resourceactivity.pk for resourceactivity in resourceactivity_qs] + resourceactivity_loi = [ + resourceactivity.pk for resourceactivity in resourceactivity_qs + ] media_qs = Media.keyword_search(keyword) media_loi = [media.pk for media in media_qs] return ResourceActivityMediaEvents.objects.filter( - Q(resourceactivityid__in=resourceactivity_loi) | - Q(mediaid__in=media_loi) | - Q(relationshipdescription__icontains=keyword) + Q(resourceactivityid__in=resourceactivity_loi) + | Q(mediaid__in=media_loi) + | Q(relationshipdescription__icontains=keyword) ) def name(self): - return 'resource activity media' + return "resource activity media" def image(self): - return settings.RECORD_ICONS['activity'] + return settings.RECORD_ICONS["activity"] def subtitle(self): return self.relationshipdescription def link(self): - return '/explore/resourceactivitymediaevents/%d/' % self.pk + return "/explore/resourceactivitymediaevents/%d/" % self.pk def relationships(self): relationship_list = [] - relationship_list.append({'key':'Activity', 'value':[self.resourceactivityid.get_query_json()]}) - relationship_list.append({'key':'Media', 'value':[self.mediaid.get_query_json()]}) + relationship_list.append( + {"key": "Activity", "value": [self.resourceactivityid.get_query_json()]} + ) + relationship_list.append( + {"key": "Media", "value": [self.mediaid.get_query_json()]} + ) return relationship_list def data(self): return [ - {'key':'resource activity', 'value': str(self.resourceactivityid)}, - {'key':'media', 'value': str(self.mediaid)}, - {'key':'relationship description', 'value': self.relationshipdescription}, - {'key':'pages', 'value': self.pages} + {"key": "resource activity", "value": str(self.resourceactivityid)}, + {"key": "media", "value": str(self.mediaid)}, + {"key": "relationship description", "value": self.relationshipdescription}, + {"key": "pages", "value": self.pages}, ] def get_response_format(self): - type = 'Resourceactivitymediaevents' - category_name = 'Activity - Media' + type = "Resourceactivitymediaevents" + category_name = "Activity - Media" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': self.relationshipdescription, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": self.relationshipdescription, + "link": "/explore/%s/%d" % (type, self.pk), } def get_relationship_model(self, req_model): @@ -2613,116 +3718,162 @@ def get_relationship_model(self, req_model): else: return self.resourceactivityid -#Unsure why this is not a 'SimpleRelationship' + +# Unsure why this is not a 'SimpleRelationship' class ResourceAltIndigenousName(DefaultModel, DefaultModeratedModel, ModeratedModel): - altindigenousnameid = models.AutoField(db_column='altindigenousnameid', primary_key=True) - resourceid = models.ForeignKey(Resources, db_column='resourceid', blank=True, null=True, verbose_name='resource', default=None, on_delete=models.SET_DEFAULT) - altindigenousname = models.CharField(db_column='altindigenousname', max_length=255, blank=True, null=True, verbose_name='alt name') + altindigenousnameid = models.AutoField( + db_column="altindigenousnameid", primary_key=True + ) + resourceid = models.ForeignKey( + Resources, + db_column="resourceid", + blank=True, + null=True, + verbose_name="resource", + default=None, + on_delete=models.SET_DEFAULT, + ) + altindigenousname = models.CharField( + db_column="altindigenousname", + max_length=255, + blank=True, + null=True, + verbose_name="alt name", + ) class Meta: managed = MANAGED - db_table = 'resourcealtindigenousname' - app_label = 'Relationships' - verbose_name = 'Resource Alternative Name' - verbose_name_plural = 'Resource Alternative Names' + db_table = "resourcealtindigenousname" + app_label = "Relationships" + verbose_name = "Resource Alternative Name" + verbose_name_plural = "Resource Alternative Names" def get_query_json(self): - return { - 'name': str(self), - 'link': False - } + return {"name": str(self), "link": False} def data(self): return [ - {'key':'resource', 'value': str(self.resourceid)}, - {'key':'alternate name', 'value':str(self.altindigenousname)}, + {"key": "resource", "value": str(self.resourceid)}, + {"key": "alternate name", "value": str(self.altindigenousname)}, ] def __unicode__(self): - return unicode('%s' % (self.altindigenousname)) + return unicode("%s" % (self.altindigenousname)) # noqa: F821 def __str__(self): - return self.altindigenousname or '' + return self.altindigenousname or "" + class ResourceResourceEvents(SimpleRelationship): - resourceid = models.ForeignKey(Resources, db_column='resourceid', primary_key=False, related_name="resource_a", on_delete=models.CASCADE) - altresourceid = models.ForeignKey(Resources, db_column='altresourceid', related_name="resource_b", on_delete=models.CASCADE) - relationshipdescription = HTMLField(db_column='relationshipdescription', blank=True, null=True, verbose_name='relationship description') + resourceid = models.ForeignKey( + Resources, + db_column="resourceid", + primary_key=False, + related_name="resource_a", + on_delete=models.CASCADE, + ) + altresourceid = models.ForeignKey( + Resources, + db_column="altresourceid", + related_name="resource_b", + on_delete=models.CASCADE, + ) + relationshipdescription = HTMLField( + db_column="relationshipdescription", + blank=True, + null=True, + verbose_name="relationship description", + ) class Meta: managed = MANAGED - db_table = 'resourceresourceevents' - unique_together = (('resourceid', 'altresourceid'),) - app_label = 'Relationships' - verbose_name_plural = 'Resources - Resources' + db_table = "resourceresourceevents" + unique_together = (("resourceid", "altresourceid"),) + app_label = "Relationships" + verbose_name_plural = "Resources - Resources" def __unicode__(self): - return unicode("%s %s" % (str(self.resourceid), str(self.altresourceid))) + return unicode("%s %s" % (str(self.resourceid), str(self.altresourceid))) # noqa: F821 def __str__(self): - return "%s %s" % (str(self.resourceid), str(self.altresourceid)) or '' + return "%s %s" % (str(self.resourceid), str(self.altresourceid)) or "" def keyword_search(keyword): resource_qs = Resources.keyword_search(keyword) resource_loi = [resource.pk for resource in resource_qs] return ResourceResourceEvents.objects.filter( - Q(resourceid__in=resource_loi) | - Q(altresourceid__in=resource_loi) | - Q(relationshipdescription__icontains=keyword) + Q(resourceid__in=resource_loi) + | Q(altresourceid__in=resource_loi) + | Q(relationshipdescription__icontains=keyword) ) def image(self): - return settings.RECORD_ICONS['activity'] + return settings.RECORD_ICONS["activity"] def subtitle(self): return self.relationshipdescription def link(self): - return '/explore/resourceresourceevents/%d/' % self.pk + return "/explore/resourceresourceevents/%d/" % self.pk def relationships(self): relationship_list = [] - relationship_list.append({'key':'Resource', 'value':[self.resourceid.get_query_json()]}) - relationship_list.append({'key':'Alternate Resource', 'value':[self.altresourceid.get_query_json()]}) + relationship_list.append( + {"key": "Resource", "value": [self.resourceid.get_query_json()]} + ) + relationship_list.append( + { + "key": "Alternate Resource", + "value": [self.altresourceid.get_query_json()], + } + ) return relationship_list def data(self): return [ - {'key':'resource a', 'value': str(self.resourceid)}, - {'key':'resource b', 'value': str(self.altresourceid)}, - {'key':'relationship description', 'value': self.relationshipdescription} + {"key": "resource a", "value": str(self.resourceid)}, + {"key": "resource b", "value": str(self.altresourceid)}, + {"key": "relationship description", "value": self.relationshipdescription}, ] def get_response_format(self): - type = 'Resourceresourceevents' + type = "Resourceresourceevents" category_name = "Resource - Resource" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': self.relationshipdescription, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": self.relationshipdescription, + "link": "/explore/%s/%d" % (type, self.pk), } # Need to create two-sided pairs for these relationships to show up correctly in the admin - this could fuzz-up the querying, though def save(self, *args, **kwargs): super(ResourceResourceEvents, self).save(*args, **kwargs) - relatedResources = ResourceResourceEvents.objects.filter(resourceid=self.altresourceid, altresourceid=self.resourceid) + relatedResources = ResourceResourceEvents.objects.filter( + resourceid=self.altresourceid, altresourceid=self.resourceid + ) if len(relatedResources) == 1: - relatedResources[0].relationshipdescription=self.relationshipdescription + relatedResources[0].relationshipdescription = self.relationshipdescription super(ResourceResourceEvents, relatedResources[0]).save() else: - ResourceResourceEvents.objects.create(resourceid=self.altresourceid, altresourceid=self.resourceid, relationshipdescription=self.relationshipdescription) + ResourceResourceEvents.objects.create( + resourceid=self.altresourceid, + altresourceid=self.resourceid, + relationshipdescription=self.relationshipdescription, + ) def delete(self, *args, **kwargs): super(ResourceResourceEvents, self).delete(*args, **kwargs) try: - pair = ResourceResourceEvents.objects.get(resourceid=self.altresourceid, altresourceid=self.resourceid) + pair = ResourceResourceEvents.objects.get( + resourceid=self.altresourceid, altresourceid=self.resourceid + ) pair.delete() - except Exception as e: + except Exception: pass # This simple relationship is tricky due to both fields being FKs to the same model @@ -2736,34 +3887,51 @@ def get_relationship_json(self, req_model_type): other_resource = self.get_relationship_model(self) rel_model_json = other_resource.get_query_json() return { - 'name': rel_model_json['name'], - 'link': rel_model_json['link'], - 'issimplerelationship': self.is_simple_relationship(), - 'data': { - 'description': self.relationshipdescription, - 'pages': None, + "name": rel_model_json["name"], + "link": rel_model_json["link"], + "issimplerelationship": self.is_simple_relationship(), + "data": { + "description": self.relationshipdescription, + "pages": None, }, } + class ResourcesCitationEvents(SimpleRelationship): - resourceid = models.ForeignKey(Resources, db_column='resourceid', primary_key=False, verbose_name='resource', on_delete=models.CASCADE) - citationid = models.ForeignKey(Citations, db_column='citationid', verbose_name='citation', on_delete=models.CASCADE) - relationshipdescription = HTMLField(db_column='relationshipdescription', blank=True, null=True, verbose_name='excerpt/description') - pages = models.CharField(db_column='pages', max_length=255, blank=True, null=True) + resourceid = models.ForeignKey( + Resources, + db_column="resourceid", + primary_key=False, + verbose_name="resource", + on_delete=models.CASCADE, + ) + citationid = models.ForeignKey( + Citations, + db_column="citationid", + verbose_name="citation", + on_delete=models.CASCADE, + ) + relationshipdescription = HTMLField( + db_column="relationshipdescription", + blank=True, + null=True, + verbose_name="excerpt/description", + ) + pages = models.CharField(db_column="pages", max_length=255, blank=True, null=True) class Meta: managed = MANAGED - db_table = 'resourcescitationevents' - verbose_name = 'Resource - Source' - verbose_name_plural = 'Resources - Sources' - unique_together = (('resourceid', 'citationid'),) - app_label = 'Relationships' + db_table = "resourcescitationevents" + verbose_name = "Resource - Source" + verbose_name_plural = "Resources - Sources" + unique_together = (("resourceid", "citationid"),) + app_label = "Relationships" def __unicode__(self): - return unicode("%s %s" % (str(self.resourceid), str(self.citationid))) + return unicode("%s %s" % (str(self.resourceid), str(self.citationid))) # noqa: F821 def __str__(self): - return "%s %s" % (str(self.resourceid), str(self.citationid)) or '' + return "%s %s" % (str(self.resourceid), str(self.citationid)) or "" def keyword_search(keyword): resource_qs = Resources.keyword_search(keyword) @@ -2773,45 +3941,49 @@ def keyword_search(keyword): citation_loi = [citation.pk for citation in citation_qs] return ResourcesCitationEvents.objects.filter( - Q(citationid__in=citation_loi) | - Q(resourceid__in=resource_loi) | - Q(relationshipdescription__icontains=keyword) + Q(citationid__in=citation_loi) + | Q(resourceid__in=resource_loi) + | Q(relationshipdescription__icontains=keyword) ) def image(self): - return settings.RECORD_ICONS['activity'] + return settings.RECORD_ICONS["activity"] def subtitle(self): return self.relationshipdescription def link(self): - return '/explore/resourcescitationevents/%d/' % self.pk + return "/explore/resourcescitationevents/%d/" % self.pk def relationships(self): relationship_list = [] - relationship_list.append({'key':'Resource', 'value':[self.resourceid.get_query_json()]}) - relationship_list.append({'key':'Bibliographic Source', 'value':[self.citationid.get_query_json()]}) + relationship_list.append( + {"key": "Resource", "value": [self.resourceid.get_query_json()]} + ) + relationship_list.append( + {"key": "Bibliographic Source", "value": [self.citationid.get_query_json()]} + ) return relationship_list def data(self): return [ - {'key':'resource', 'value': str(self.resourceid)}, - {'key':'citation', 'value': str(self.citationid)}, - {'key':'relationship description', 'value': self.relationshipdescription}, - {'key':'pages', 'value': self.pages} + {"key": "resource", "value": str(self.resourceid)}, + {"key": "citation", "value": str(self.citationid)}, + {"key": "relationship description", "value": self.relationshipdescription}, + {"key": "pages", "value": self.pages}, ] def get_response_format(self): - type = 'Resourcescitationevents' + type = "Resourcescitationevents" category_name = "Resource - Source" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': self.relationshipdescription, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": self.relationshipdescription, + "link": "/explore/%s/%d" % (type, self.pk), } def get_relationship_model(self, req_model): @@ -2820,25 +3992,39 @@ def get_relationship_model(self, req_model): else: return self.resourceid + class ResourcesMediaEvents(SimpleRelationship): - resourceid = models.ForeignKey(Resources, db_column='resourceid', primary_key=False, verbose_name='resource', on_delete=models.CASCADE) - mediaid = models.ForeignKey(Media, db_column='mediaid', verbose_name='media', on_delete=models.CASCADE) - relationshipdescription = HTMLField(db_column='relationshipdescription', blank=True, null=True, verbose_name='relationship description') - pages = models.CharField(db_column='pages', max_length=50, blank=True, null=True) + resourceid = models.ForeignKey( + Resources, + db_column="resourceid", + primary_key=False, + verbose_name="resource", + on_delete=models.CASCADE, + ) + mediaid = models.ForeignKey( + Media, db_column="mediaid", verbose_name="media", on_delete=models.CASCADE + ) + relationshipdescription = HTMLField( + db_column="relationshipdescription", + blank=True, + null=True, + verbose_name="relationship description", + ) + pages = models.CharField(db_column="pages", max_length=50, blank=True, null=True) class Meta: managed = MANAGED - db_table = 'resourcesmediaevents' - verbose_name = 'Resource - Medium' - verbose_name_plural = 'Resources - Media' - unique_together = (('resourceid', 'mediaid'),) - app_label = 'Relationships' + db_table = "resourcesmediaevents" + verbose_name = "Resource - Medium" + verbose_name_plural = "Resources - Media" + unique_together = (("resourceid", "mediaid"),) + app_label = "Relationships" def __unicode__(self): - return unicode("%s %s" % (str(self.resourceid), str(self.mediaid))) + return unicode("%s %s" % (str(self.resourceid), str(self.mediaid))) # noqa: F821 def __str__(self): - return "%s %s" % (str(self.resourceid), str(self.mediaid)) or '' + return "%s %s" % (str(self.resourceid), str(self.mediaid)) or "" def keyword_search(keyword): resource_qs = Resources.keyword_search(keyword) @@ -2848,45 +4034,49 @@ def keyword_search(keyword): media_loi = [media.pk for media in media_qs] return ResourcesMediaEvents.objects.filter( - Q(mediaid__in=media_loi) | - Q(resourceid__in=resource_loi) | - Q(relationshipdescription__icontains=keyword) + Q(mediaid__in=media_loi) + | Q(resourceid__in=resource_loi) + | Q(relationshipdescription__icontains=keyword) ) def image(self): - return settings.RECORD_ICONS['activity'] + return settings.RECORD_ICONS["activity"] def subtitle(self): return self.relationshipdescription def link(self): - return '/explore/resourcesmediaevents/%d/' % self.pk + return "/explore/resourcesmediaevents/%d/" % self.pk def relationships(self): relationship_list = [] - relationship_list.append({'key':'Resource', 'value':[self.resourceid.get_query_json()]}) - relationship_list.append({'key':'Media', 'value':[self.mediaid.get_query_json()]}) + relationship_list.append( + {"key": "Resource", "value": [self.resourceid.get_query_json()]} + ) + relationship_list.append( + {"key": "Media", "value": [self.mediaid.get_query_json()]} + ) return relationship_list def data(self): return [ - {'key':'resource', 'value': str(self.resourceid)}, - {'key':'media', 'value': str(self.mediaid)}, - {'key':'relationship description', 'value': self.relationshipdescription}, - {'key':'pages', 'value': self.pages} + {"key": "resource", "value": str(self.resourceid)}, + {"key": "media", "value": str(self.mediaid)}, + {"key": "relationship description", "value": self.relationshipdescription}, + {"key": "pages", "value": self.pages}, ] def get_response_format(self): - type = 'Resourcesmediaevents' + type = "Resourcesmediaevents" category_name = "Resource - Media" return { - 'id': self.pk, - 'type': type, - 'category_name': category_name, - 'name': str(self), - 'image': self.image(), - 'description': self.relationshipdescription, - 'link': '/explore/%s/%d' % (type, self.pk) + "id": self.pk, + "type": type, + "category_name": category_name, + "name": str(self), + "image": self.image(), + "description": self.relationshipdescription, + "link": "/explore/%s/%d" % (type, self.pk), } def get_relationship_model(self, req_model): @@ -2895,74 +4085,98 @@ def get_relationship_model(self, req_model): else: return self.resourceid -from django.contrib.auth.models import Group class UserAccess(DefaultModeratedModel, ModeratedModel): - group = models.OneToOneField(Group, db_column='group_id', on_delete=models.CASCADE) - accessid = models.AutoField(db_column='accessid', primary_key=True) - accesslevel = models.CharField(db_column='accesslevel', max_length=255, blank=True, null=True, verbose_name='access level') + group = models.OneToOneField(Group, db_column="group_id", on_delete=models.CASCADE) + accessid = models.AutoField(db_column="accessid", primary_key=True) + accesslevel = models.CharField( + db_column="accesslevel", + max_length=255, + blank=True, + null=True, + verbose_name="access level", + ) class Meta: managed = MANAGED - db_table = 'useraccess' - app_label = 'Accounts' - verbose_name = 'user access' - verbose_name_plural = 'user access' + db_table = "useraccess" + app_label = "Accounts" + verbose_name = "user access" + verbose_name_plural = "user access" def __unicode__(self): - return unicode('%s' % (self.accesslevel)) + return unicode("%s" % (self.accesslevel)) # noqa: F821 def __str__(self): - return self.accesslevel or '' + return self.accesslevel or "" + class Users(AbstractUser): - userid = models.AutoField(db_column='userid', primary_key=True) - username = models.CharField(db_column='username', max_length=20, verbose_name='username', unique=True) - password = models.CharField(_('password'), max_length=128, db_column='password') - first_name = models.CharField(db_column='firstname', max_length=255, verbose_name='first name') - last_name = models.CharField(db_column='lastname', max_length=255, verbose_name='last name') - affiliation = models.CharField(db_column='affiliation', max_length=255) - title = models.CharField(db_column='title', max_length=255) - accesslevel = models.ForeignKey(UserAccess, db_column='accesslevel', verbose_name='access level', null=True, blank=True, default=None, on_delete=models.SET_DEFAULT) + userid = models.AutoField(db_column="userid", primary_key=True) + username = models.CharField( + db_column="username", max_length=20, verbose_name="username", unique=True + ) + password = models.CharField(_("password"), max_length=128, db_column="password") + first_name = models.CharField( + db_column="firstname", max_length=255, verbose_name="first name" + ) + last_name = models.CharField( + db_column="lastname", max_length=255, verbose_name="last name" + ) + affiliation = models.CharField(db_column="affiliation", max_length=255) + title = models.CharField(db_column="title", max_length=255) + accesslevel = models.ForeignKey( + UserAccess, + db_column="accesslevel", + verbose_name="access level", + null=True, + blank=True, + default=None, + on_delete=models.SET_DEFAULT, + ) is_superuser = models.BooleanField( - _('superuser status'), + _("superuser status"), default=False, help_text=_( - 'Designates that this user has all permissions without ' - 'explicitly assigning them.' + "Designates that this user has all permissions without " + "explicitly assigning them." ), - db_column='is_superuser' + db_column="is_superuser", + ) + email = models.EmailField( + _("email address"), blank=True, null=True, db_column="email" ) - email = models.EmailField(_('email address'), blank=True, null=True, db_column='email') is_staff = models.BooleanField( - _('staff status'), + _("staff status"), default=False, - help_text=_('Designates whether the user can log into this admin site.'), - db_column='is_staff' + help_text=_("Designates whether the user can log into this admin site."), + db_column="is_staff", ) is_active = models.BooleanField( - _('active'), + _("active"), default=True, help_text=_( - 'Designates whether this user should be treated as active. ' - 'Unselect this instead of deleting accounts.' + "Designates whether this user should be treated as active. " + "Unselect this instead of deleting accounts." ), - db_column='is_active' + db_column="is_active", + ) + date_joined = models.DateTimeField( + _("date joined"), default=timezone.now, db_column="date_joined" ) - date_joined = models.DateTimeField(_('date joined'), default=timezone.now, db_column='date_joined') class Meta: managed = MANAGED - db_table = 'users' - app_label = 'Accounts' - verbose_name = 'User' - verbose_name_plural = 'Users' + db_table = "users" + app_label = "Accounts" + verbose_name = "User" + verbose_name_plural = "Users" def __unicode__(self): - return unicode('%s' % (self.username)) + return unicode("%s" % (self.username)) # noqa: F821 def __str__(self): - return self.username or '' + return self.username or "" def save(self, *args, **kwargs): if not self.userid: @@ -2976,8 +4190,8 @@ def save(self, *args, **kwargs): self.is_staff = True else: self.is_staff = False - if self.accesslevel and self.accesslevel.accesslevel == 'Administrator': + if self.accesslevel and self.accesslevel.accesslevel == "Administrator": self.is_superuser = True else: self.is_superuser = False - super(Users, self).save(*args, **kwargs) \ No newline at end of file + super(Users, self).save(*args, **kwargs) diff --git a/TEKDB/TEKDB/settings.py b/TEKDB/TEKDB/settings.py index eb17fe5f..588a1fb9 100644 --- a/TEKDB/TEKDB/settings.py +++ b/TEKDB/TEKDB/settings.py @@ -14,9 +14,9 @@ from glob import glob try: - GDAL_LIBRARY_PATH=glob('/usr/lib/libgdal.so.*')[0] - GEOS_LIBRARY_PATH=glob('/usr/lib/libgeos_c.so.*')[0] -except IndexError as e: + GDAL_LIBRARY_PATH = glob("/usr/lib/libgdal.so.*")[0] + GEOS_LIBRARY_PATH = glob("/usr/lib/libgeos_c.so.*")[0] +except IndexError: pass @@ -35,7 +35,7 @@ # ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS", default='*').split(" ") ALLOWED_HOSTS = [] -ALLOWED_HOSTS_ENV = os.environ.get('ALLOWED_HOSTS') +ALLOWED_HOSTS_ENV = os.environ.get("ALLOWED_HOSTS") if ALLOWED_HOSTS_ENV: ALLOWED_HOSTS.extend(ALLOWED_HOSTS_ENV.split(",")) @@ -45,108 +45,110 @@ # Application definition INSTALLED_APPS = [ - 'dal', - 'dal_select2', - 'django.contrib.contenttypes', - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'django.contrib.gis', - 'colorfield', + "dal", + "dal_select2", + "django.contrib.contenttypes", + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", + "django.contrib.gis", + "colorfield", # 'registration', - 'leaflet', - 'nested_admin', - 'coverage', - 'configuration', - 'explore', - 'login', - 'TEKDB', - 'tinymce', - 'Lookup', - 'Accounts', - 'Relationships', - 'reversion', - 'django.contrib.sites', + "leaflet", + "nested_admin", + "coverage", + "configuration", + "explore", + "login", + "TEKDB", + "tinymce", + "Lookup", + "Accounts", + "Relationships", + "reversion", + "django.contrib.sites", # 'moderation.apps.SimpleModerationConfig', ] MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', + "django.middleware.security.SecurityMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", ] -ROOT_URLCONF = 'TEKDB.urls' +ROOT_URLCONF = "TEKDB.urls" TEMPLATES = [ { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [ - os.path.join(BASE_DIR, 'TEKDB/templates'), - os.path.join(BASE_DIR, 'login/templates'), - os.path.join(BASE_DIR, 'explore/templates'), + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [ + os.path.join(BASE_DIR, "TEKDB/templates"), + os.path.join(BASE_DIR, "login/templates"), + os.path.join(BASE_DIR, "explore/templates"), ], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.template.context_processors.media', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - 'explore.context_processors.explore_context', - 'TEKDB.context_processors.search_settings', + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.template.context_processors.media", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", + "explore.context_processors.explore_context", + "TEKDB.context_processors.search_settings", # 'TEKDB.context_processors.add_map_default_context' ], }, }, ] -LOGIN_URL = '/' +LOGIN_URL = "/" -WSGI_APPLICATION = 'TEKDB.wsgi.application' +WSGI_APPLICATION = "TEKDB.wsgi.application" # Database # https://docs.djangoproject.com/en/1.10/ref/settings/#databases DATABASES = { - 'default': { - "ENGINE": os.environ.get("SQL_ENGINE", "django.contrib.gis.db.backends.postgis"), + "default": { + "ENGINE": os.environ.get( + "SQL_ENGINE", "django.contrib.gis.db.backends.postgis" + ), "NAME": os.environ.get("SQL_DATABASE", "tekdb"), "USER": os.environ.get("SQL_USER", "postgres"), "PASSWORD": os.environ.get("SQL_PASSWORD", None), - "HOST": os.environ.get("SQL_HOST", 'db'), + "HOST": os.environ.get("SQL_HOST", "db"), "PORT": os.environ.get("SQL_PORT", None), } } -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' +DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" # Password validation # https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", }, ] -#Registration +# Registration ACCOUNT_ACTIVATION_DAYS = 14 @@ -156,27 +158,27 @@ # Internationalization # https://docs.djangoproject.com/en/1.10/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = "en-us" -TIME_ZONE = 'America/Los_Angeles' +TIME_ZONE = "America/Los_Angeles" USE_I18N = True USE_TZ = True STATICFILES_FINDERS = [ - 'django.contrib.staticfiles.finders.FileSystemFinder', - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', + "django.contrib.staticfiles.finders.FileSystemFinder", + "django.contrib.staticfiles.finders.AppDirectoriesFinder", ] # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.10/howto/static-files/ -MEDIA_URL = '/media/' +MEDIA_URL = "/media/" MEDIA_ROOT = os.path.join(BASE_DIR, "media") -STATIC_URL = '/static/' +STATIC_URL = "/static/" STATIC_ROOT = os.path.join(BASE_DIR, "static") @@ -191,19 +193,19 @@ ### Search Settings SEARCH_CATEGORIES = [ - 'all', - 'places', - 'resources', - 'activities', - 'citations', - 'media', + "all", + "places", + "resources", + "activities", + "citations", + "media", ] -#Locality? People? +# Locality? People? MIN_SEARCH_RANK = 0.1 MIN_SEARCH_SIMILARITY = 0.1 -AUTH_USER_MODEL = 'Accounts.Users' +AUTH_USER_MODEL = "Accounts.Users" ########################################### ## TINYMCE ### @@ -228,93 +230,97 @@ TINYMCE_FILEBROWSER = False # Add Version to the admin site header -VERSION = '2.2.2' -ADMIN_SITE_HEADER = os.environ.get("ADMIN_SITE_HEADER", default='ITK DB Admin v{}'.format(VERSION)) +VERSION = "2.2.2" +ADMIN_SITE_HEADER = os.environ.get( + "ADMIN_SITE_HEADER", default="ITK DB Admin v{}".format(VERSION) +) -# X Frame Options +# X Frame Options # The Django Default is 'DENY' # SAMEORIGIN allows the page to be displayed in a frame on the same origin as the page itself -X_FRAME_OPTIONS = 'SAMEORIGIN' +X_FRAME_OPTIONS = "SAMEORIGIN" -TIME_ZONE = os.environ.get("TIME_ZONE", default='America/Los_Angeles') +TIME_ZONE = os.environ.get("TIME_ZONE", default="America/Los_Angeles") REGISTRATION_OPEN = os.environ.get("REGISTRATION_OPEN", default=False) DATABASE_GEOGRAPHY = { ###EPSG:4326### # 'default_lon': -124.325, # 'default_lat': 42.065, ###EPSG:3857### - 'default_lon': os.environ.get("DEFAULT_LON", default=-13839795.69), - 'default_lat': os.environ.get("DEFAULT_LAT", default=5171448.926), - 'default_zoom': os.environ.get("DEFAULT_ZOOM", default=8), - 'map_template': 'gis/admin/ol2osm.html', - 'map_extent': [ + "default_lon": os.environ.get("DEFAULT_LON", default=-13839795.69), + "default_lat": os.environ.get("DEFAULT_LAT", default=5171448.926), + "default_zoom": os.environ.get("DEFAULT_ZOOM", default=8), + "map_template": "gis/admin/ol2osm.html", + "map_extent": [ os.environ.get("MAP_EXTENT_WEST", default=-24000000), os.environ.get("MAP_EXTENT_SOUTH", default=1450000), os.environ.get("MAP_EXTENT_EAST", default=-6200000), - os.environ.get("MAP_EXTENT_NORTH", default=13000000) - ], #US Territories - 'min_zoom': 2, - 'max_zoom': 19, + os.environ.get("MAP_EXTENT_NORTH", default=13000000), + ], # US Territories + "min_zoom": 2, + "max_zoom": 19, } MODERATE_STAFF = False PROJ_CSS = { - 'primary_a': '#8f371c', #red - 'primary_b': '#f7f3eb', #off white - 'primary_c': '#0e1522', #very dark blue - 'primary_d': '#ced2da', #light gray - 'secondary_a': '#51723b', #fern green - 'secondary_b': '#839230', #old moss green - 'secondary_c': '#6ea32e', #green - 'secondary_d': '#b44ba3' #rose quartz pink + "primary_a": "#8f371c", # red + "primary_b": "#f7f3eb", # off white + "primary_c": "#0e1522", # very dark blue + "primary_d": "#ced2da", # light gray + "secondary_a": "#51723b", # fern green + "secondary_b": "#839230", # old moss green + "secondary_c": "#6ea32e", # green + "secondary_d": "#b44ba3", # rose quartz pink } -PROJ_LOGO_TEXT = 'ITK' -PROJ_COLOR_SELECT = 'light' -PROJ_IMAGE_SELECT = '/static/explore/img/homepage/5050508427_ec55eed5f4_o.jpg' +PROJ_LOGO_TEXT = "ITK" +PROJ_COLOR_SELECT = "light" +PROJ_IMAGE_SELECT = "/static/explore/img/homepage/5050508427_ec55eed5f4_o.jpg" PROJ_IMAGE_ATTR = 'Image courtesy of Monteregina and used under the CC BY-NC-SA 2.0 Licence. No changes were made.' PROJ_ICONS = { - 'logo': '/static/explore/img/logos/logo_weave.svg', - 'place_icon': 'explore/img/icons/i_place.svg', - 'resource_icon': 'explore/img/icons/i_resource.svg', - 'activity_icon': 'explore/img/icons/i_activity.svg', - 'source_icon': 'explore/img/icons/i_source.svg', - 'media_icon': 'explore/img/icons/i_media.svg', - 'map_pin_icon': 'explore/img/icons/explore_map_pin.svg', - 'map_pin_selected_icon': 'explore/img/icons/explore_map_pin_selected.svg', + "logo": "/static/explore/img/logos/logo_weave.svg", + "place_icon": "explore/img/icons/i_place.svg", + "resource_icon": "explore/img/icons/i_resource.svg", + "activity_icon": "explore/img/icons/i_activity.svg", + "source_icon": "explore/img/icons/i_source.svg", + "media_icon": "explore/img/icons/i_media.svg", + "map_pin_icon": "explore/img/icons/explore_map_pin.svg", + "map_pin_selected_icon": "explore/img/icons/explore_map_pin_selected.svg", } RECORD_ICONS = { - 'person': '/static/explore/img/icons/i_activity.png', - 'activity': '/static/{}'.format(PROJ_ICONS['activity_icon']), - 'citation': '/static/{}'.format(PROJ_ICONS['source_icon']), - 'place': '/static/{}'.format(PROJ_ICONS['place_icon']), - 'media': '/static/{}'.format(PROJ_ICONS['media_icon']), - 'event': '/static/{}'.format(PROJ_ICONS['activity_icon']), - 'resource': '/static/{}'.format(PROJ_ICONS['resource_icon']), - 'map_pin': '/static/{}'.format(PROJ_ICONS['map_pin_icon']), - 'map_pin_selected': '/static/{}'.format(PROJ_ICONS['map_pin_selected_icon']), + "person": "/static/explore/img/icons/i_activity.png", + "activity": "/static/{}".format(PROJ_ICONS["activity_icon"]), + "citation": "/static/{}".format(PROJ_ICONS["source_icon"]), + "place": "/static/{}".format(PROJ_ICONS["place_icon"]), + "media": "/static/{}".format(PROJ_ICONS["media_icon"]), + "event": "/static/{}".format(PROJ_ICONS["activity_icon"]), + "resource": "/static/{}".format(PROJ_ICONS["resource_icon"]), + "map_pin": "/static/{}".format(PROJ_ICONS["map_pin_icon"]), + "map_pin_selected": "/static/{}".format(PROJ_ICONS["map_pin_selected_icon"]), } -# Not sure if this is the best way to implement fonts. +# Not sure if this is the best way to implement fonts. # It gets tricky bc there will likely be multiple formats for each font. # For example: .ttf, .otf, .woff, .woff2, .svg -# We'll need to figure out how to handle this better. +# We'll need to figure out how to handle this better. # TODO: Plan to revisit this later. PROJ_FONTS = { - 'font_face_primary': '/static/explore/fonts/Open_Sans/static/OpenSans-Regular-export/OpenSans-Regular.css', - 'font_face_primary_bold': '/static/explore/fonts/Open_Sans/static/OpenSans-Bold-export/OpenSans-Bold.css', + "font_face_primary": "/static/explore/fonts/Open_Sans/static/OpenSans-Regular-export/OpenSans-Regular.css", + "font_face_primary_bold": "/static/explore/fonts/Open_Sans/static/OpenSans-Bold-export/OpenSans-Bold.css", } -HOME_FONT_COLOR = '#FFFFFF' -HOME_LEFT_BACKGROUND = '#000000' -HOME_RIGHT_BACKGROUND = '#000000' +HOME_FONT_COLOR = "#FFFFFF" +HOME_LEFT_BACKGROUND = "#000000" +HOME_RIGHT_BACKGROUND = "#000000" DEFAULT_MAXIMUM_RESULTS = 500 try: - from TEKDB.local_settings import * -except Exception as e: - print("ERROR: Unable to load local_settings.py. This is expected for docker deployment") + from TEKDB.local_settings import * # noqa: F403 +except Exception: + print( + "ERROR: Unable to load local_settings.py. This is expected for docker deployment" + ) diff --git a/TEKDB/TEKDB/tests/test_admin.py b/TEKDB/TEKDB/tests/test_admin.py index 0799b0c1..a5de7147 100644 --- a/TEKDB/TEKDB/tests/test_admin.py +++ b/TEKDB/TEKDB/tests/test_admin.py @@ -1,5 +1,5 @@ # from django.conf import settings -from django.test import TestCase, RequestFactory +from django.test import RequestFactory from django.core.files.uploadedfile import SimpleUploadedFile from django.contrib.auth import get_user_model from django.contrib.admin.sites import AdminSite @@ -12,35 +12,46 @@ User = get_user_model() -class MediaBulkUploadAdminTest(ITKTestCase): +class MediaBulkUploadAdminTest(ITKTestCase): def setUp(self): self.factory = RequestFactory() - self.user = User.objects.create_superuser(username='admin2', password='password', email='admin@example.com') + self.user = User.objects.create_superuser( + username="admin2", password="password", email="admin@example.com" + ) def test_media_bulk_upload_admin_add(self): - url = reverse('admin:TEKDB_mediabulkupload_add') - test_image = SimpleUploadedFile("./test_image.jpg", b"\x00\x00\x00\x00", content_type="image") + url = reverse("admin:TEKDB_mediabulkupload_add") + test_image = SimpleUploadedFile( + "./test_image.jpg", b"\x00\x00\x00\x00", content_type="image" + ) # TODO: Associate the images with 1+ Places, Resources, Citations, Activities, and PlacesResources - request = self.factory.post(url, { - # 'mediabulkname': 'Test Bulk Upload', - # 'mediabulkdate': '2024-12-12', - 'files': [test_image, test_image], - }) + request = self.factory.post( + url, + { + # 'mediabulkname': 'Test Bulk Upload', + # 'mediabulkdate': '2024-12-12', + "files": [test_image, test_image], + }, + ) request.user = self.user bulk_admin = MediaBulkUploadAdmin(model=MediaBulkUpload, admin_site=AdminSite()) bulk_form = MediaBulkUploadForm(request.POST) bulk_form.is_valid() - bulk_admin.save_model(obj=MediaBulkUpload(), request=request, form=bulk_form, change=None) + bulk_admin.save_model( + obj=MediaBulkUpload(), request=request, form=bulk_form, change=None + ) - self.assertTrue(Media.objects.filter(medianame='test_image').exists()) - self.assertTrue(Media.objects.filter(medianame='test_image').count() == 2) + self.assertTrue(Media.objects.filter(medianame="test_image").exists()) + self.assertTrue(Media.objects.filter(medianame="test_image").count() == 2) - for media in Media.objects.filter(medianame='test_image'): + for media in Media.objects.filter(medianame="test_image"): self.assertTrue(os.path.exists(media.mediafile.path)) - os.remove(media.mediafile.path) # Clean up the uploaded files after the test + os.remove( + media.mediafile.path + ) # Clean up the uploaded files after the test self.assertFalse(os.path.exists(media.mediafile.path)) media.delete() @@ -61,4 +72,4 @@ def test_media_bulk_upload_admin_add(self): # url = reverse('admin:TEKDB_mediabulkupload_delete', args=[media_bulk_upload.id]) # response = self.client.post(url, {'post': 'yes'}) # self.assertEqual(response.status_code, 302) - # self.assertFalse(MediaBulkUpload.objects.filter(id=media_bulk_upload.id).exists()) \ No newline at end of file + # self.assertFalse(MediaBulkUpload.objects.filter(id=media_bulk_upload.id).exists()) diff --git a/TEKDB/TEKDB/tests/test_models.py b/TEKDB/TEKDB/tests/test_models.py index 1a77830d..0d88cf60 100644 --- a/TEKDB/TEKDB/tests/test_models.py +++ b/TEKDB/TEKDB/tests/test_models.py @@ -1,7 +1,42 @@ from django.test import TestCase -from TEKDB.models import * -from django.utils import timezone -from django.urls import reverse +from TEKDB.models import ( + Places, + Resources, + ResourcesActivityEvents, + Citations, + Media, + MediaBulkUpload, + ResourceActivityMediaEvents, + ResourceActivityCitationEvents, + MediaCitationEvents, + PlacesResourceMediaEvents, + PlacesResourceCitationEvents, + PlaceAltIndigenousName, + PlacesMediaEvents, + PlacesResourceEvents, + ResourcesCitationEvents, + PlacesCitationEvents, + ResourceAltIndigenousName, + ResourcesMediaEvents, + ResourceResourceEvents, + LookupActivity, + LookupAuthorType, + LookupCustomaryUse, + LookupHabitat, + LookupPlanningUnit, + LookupReferenceType, + LookupMediaType, + LookupParticipants, + LookupPartUsed, + People, + LookupResourceGroup, + LookupSeason, + LookupTechniques, + LookupTiming, + LookupTribe, + LookupUserInfo, +) + # from .forms import * from django.conf import settings from django.db import connection @@ -17,6 +52,7 @@ # MODELS W/ keyword_search ### + def test_model_id_collision(model, insertion_object, test): """ Test that saving an object can recover from an ID collision @@ -27,10 +63,10 @@ def test_model_id_collision(model, insertion_object, test): PK_FIELD = model._meta.pk.name SEQUENCE_NAME = '"{}_{}_seq"'.format(DB_TABLE, PK_FIELD) ORIGINAL_COUNT = model.objects.all().count() - MAX_ID = model.objects.all().order_by('-pk')[0].pk + MAX_ID = model.objects.all().order_by("-pk")[0].pk cur = connection.cursor() - cur.execute('SELECT setval(%s, %s)', (SEQUENCE_NAME, MAX_ID - 1)) + cur.execute("SELECT setval(%s, %s)", (SEQUENCE_NAME, MAX_ID - 1)) new_obj = model.objects.create(**insertion_object) new_obj.save() test.assertTrue(new_obj.pk > MAX_ID) @@ -49,6 +85,7 @@ class ITKTestCase(TestCase): """ Base class for all ITK tests. """ + # fixtures = ['TEKDB/fixtures/all_dummy_data.json',] @classmethod @@ -57,8 +94,11 @@ def setUpClass(self): Set up the test case. """ super().setUpClass() - import_fixture_file(join(settings.BASE_DIR, 'TEKDB', 'fixtures', 'all_dummy_data.json')) - + import_fixture_file( + join(settings.BASE_DIR, "TEKDB", "fixtures", "all_dummy_data.json") + ) + + class ITKSearchTest(ITKTestCase): """ Base class for all ITK search tests. @@ -71,21 +111,22 @@ def setUpClass(self): """ super().setUpClass() cur = connection.cursor() - cur.execute('CREATE EXTENSION IF NOT EXISTS pg_trgm;') + cur.execute("CREATE EXTENSION IF NOT EXISTS pg_trgm;") + #################################################### # Search Tests #################################################### -class MiscSearchTest(ITKSearchTest): +class MiscSearchTest(ITKSearchTest): def test_empty_string_search(self): """ Test that an empty string search returns all objects """ - keyword = '' - categories = ['places','resources','activities','sources','media'] - + keyword = "" + categories = ["places", "resources", "activities", "sources", "media"] + from explore.views import get_model_by_type for category in categories: @@ -93,7 +134,11 @@ def test_empty_string_search(self): resultlist = [] for model in query_models: # Find all results matching keyword in this model - print("\n\ttest empty string search for {} equals count of {}.objects.count".format(model.__name__, model.__name__)) + print( + "\n\ttest empty string search for {} equals count of {}.objects.count".format( + model.__name__, model.__name__ + ) + ) model_results = model.keyword_search(keyword) for result in model_results: resultlist.append(result) @@ -105,14 +150,17 @@ def test_phrase_search(self): Test that a phrase search returns all objects that contain the phrase """ keyword = "salmon trout" - + from explore.views import getResults - - search_results = getResults(keyword, categories=['places','resources','activities','sources','media']) + + search_results = getResults( + keyword, + categories=["places", "resources", "activities", "sources", "media"], + ) # 24 is king salmon - self.assertTrue(24 in [x['id'] for x in search_results]) + self.assertTrue(24 in [x["id"] for x in search_results]) # 362 is cutthroat trout - self.assertTrue(362 in [x['id'] for x in search_results]) + self.assertTrue(362 in [x["id"] for x in search_results]) # LookupTribe @@ -121,9 +169,9 @@ def test_phrase_search(self): # Record Tests #################################################### + # Places class PlacesTest(ITKSearchTest): - def test_placess(self): # print("Testing Places Model") # print("Total places: {}".format(Places.objects.all().count())) @@ -141,17 +189,17 @@ def test_places_search(self): # * placealtindigenousname # * Source # * DigitizedBy - keyword = 'place' + keyword = "place" place_results = Places.keyword_search(keyword) # do we get 3 results? also checks that we do not return all results in Place category self.assertEqual(place_results.count(), 3) # checkout results belong to one of the search fields for result in place_results: - self.assertTrue(hasattr(result, 'similarity')) + self.assertTrue(hasattr(result, "similarity")) self.assertTrue( ( - result.similarity and - result.similarity > settings.MIN_SEARCH_SIMILARITY + result.similarity + and result.similarity > settings.MIN_SEARCH_SIMILARITY ) ) @@ -162,17 +210,17 @@ def test_places_search(self): # * planningunitid # * primaryhabitat # * tribeid - keyword = 'Northern' + keyword = "Northern" planning_unit_fk_search = Places.keyword_search(keyword) self.assertEqual(planning_unit_fk_search.count(), 10) self.assertTrue(25 in [x.pk for x in planning_unit_fk_search]) - keyword = 'Rocky Intertidal' + keyword = "Rocky Intertidal" habitat_fk_search = Places.keyword_search(keyword) self.assertEqual(habitat_fk_search.count(), 8) self.assertTrue(25 in [x.pk for x in habitat_fk_search]) - keyword = 'Tolowa' + keyword = "Tolowa" tribe_fk_search = Places.keyword_search(keyword) self.assertEqual(tribe_fk_search.count(), 13) self.assertTrue(25 in [x.pk for x in tribe_fk_search]) @@ -182,23 +230,22 @@ def test_places_search(self): ####################################### # Test Alternative Place Name # * PlacesResourceEvents - keyword = 'flurpie' + keyword = "flurpie" flurpie_results = Places.keyword_search(keyword) self.assertEqual(flurpie_results.count(), 3) - self.assertEqual(flurpie_results[0].indigenousplacename, 'Test') + self.assertEqual(flurpie_results[0].indigenousplacename, "Test") def test_place_id_collision(self): """ Test that saving an activity can recover from an ID collision """ - insertion_object = { - } + insertion_object = {} collision_result = test_model_id_collision(Places, insertion_object, self) self.assertTrue(collision_result) + # Resources class ResourcesTest(ITKSearchTest): - def test_resources(self): # print("Testing Resources Model") # print("Total resources: {}".format(Resources.objects.all().count())) @@ -214,32 +261,31 @@ def test_resources_search(self): # * indigenousname # * genus # * species - keyword = 'chiton' + keyword = "chiton" chiton_results = Resources.keyword_search(keyword) # do we get 16 results? self.assertEqual(chiton_results.count(), 16) # is weighting appropriate? Chiton > Chiton, Gumboot > Sea Cucumber > Skunk Cabbage for result in chiton_results: - self.assertTrue(hasattr(result,'similarity')) + self.assertTrue(hasattr(result, "similarity")) self.assertTrue( ( - result.similarity and - result.similarity >= settings.MIN_SEARCH_SIMILARITY + result.similarity + and result.similarity >= settings.MIN_SEARCH_SIMILARITY ) ) # Advanced search name, description ONLY (no genus/spceies): 2 results skunk_cabbage_id = 325 sea_cucumber_id = 305 - gumboot_chiton_id = 188 chiton_id = 187 - fields = ['commonname', 'indigenousname'] + fields = ["commonname", "indigenousname"] fk_fields = [] advanced_results = Resources.keyword_search(keyword, fields, fk_fields) # sea cukes and skunk cabbage only have 'chiton' in their genus or species name. They should not be present. self.assertEqual(advanced_results.count(), 10) for resource in advanced_results: self.assertTrue(resource.pk not in [skunk_cabbage_id, sea_cucumber_id]) - fields = ['genus', 'species'] + fields = ["genus", "species"] advanced_results = Resources.keyword_search(keyword, fields, fk_fields) # 'chiton' only has chiton in it's commonname. It should not be present. self.assertEqual(advanced_results.count(), 7) @@ -253,7 +299,7 @@ def test_resources_search(self): # Test resourceclassificationgroup search # This keyword is good to test Resources model's only foreign key field: # * resourceclassificationgroup - keyword = 'anadromous' + keyword = "anadromous" anadromous_results = Resources.keyword_search(keyword) self.assertEqual(anadromous_results.count(), 16) self.assertTrue(347 in [x.pk for x in anadromous_results]) @@ -271,10 +317,10 @@ def test_resources_search(self): # * ResourcesMediaEvents # These 4 are the 'in-between' tables for the other 4 core models. Perhaps not searching these is intentional? - keyword = 'flurpie' + keyword = "flurpie" flurpie_results = Resources.keyword_search(keyword) self.assertEqual(flurpie_results.count(), 2) - self.assertEqual(flurpie_results[0].commonname, 'Test') + self.assertEqual(flurpie_results[0].commonname, "Test") def test_resource_id_collision(self): """ @@ -286,9 +332,9 @@ def test_resource_id_collision(self): collision_result = test_model_id_collision(Resources, insertion_object, self) self.assertTrue(collision_result) + # ResourcesActivityEvents ('Activities') class ResourcesActivityEventsTest(ITKSearchTest): - def test_activity(self): # print("Testing ResourcesActivityEvents Model") # print("Total activities: {}".format(ResourcesActivityEvents.objects.all().count())) @@ -300,16 +346,16 @@ def test_activities_search(self): ##################################### # fields: - keyword = 'men' + keyword = "men" activity_results = ResourcesActivityEvents.keyword_search(keyword) self.assertEqual(activity_results.count(), 2) for result in activity_results: - self.assertTrue(hasattr(result, 'similarity')) + self.assertTrue(hasattr(result, "similarity")) self.assertTrue( ( - result.similarity and - result.similarity > settings.MIN_SEARCH_SIMILARITY + result.similarity + and result.similarity > settings.MIN_SEARCH_SIMILARITY ) ) @@ -318,14 +364,16 @@ def test_activity_id_collision(self): Test that saving an activity can recover from an ID collision """ insertion_object = { - 'placeresourceid': PlacesResourceEvents.objects.all()[0], + "placeresourceid": PlacesResourceEvents.objects.all()[0], } - collision_result = test_model_id_collision(ResourcesActivityEvents, insertion_object, self) + collision_result = test_model_id_collision( + ResourcesActivityEvents, insertion_object, self + ) self.assertTrue(collision_result) + # Citations (Bibliographic 'Sources') class CitationsTest(ITKSearchTest): - def test_citations(self): # print("Testing Places Model") # print("Total places: {}".format(Places.objects.all().count())) @@ -351,16 +399,16 @@ def test_citations_search(self): # X intervieweeid (foreign key) (not ready for testing) # X interviewerid (foreign key) (not ready for testing) - keyword = 'traditional' + keyword = "traditional" cit_results = Citations.keyword_search(keyword) self.assertEqual(cit_results.count(), 1) for result in cit_results: - self.assertTrue(hasattr(result, 'similarity')) + self.assertTrue(hasattr(result, "similarity")) self.assertTrue( ( - result.similarity and - result.similarity > settings.MIN_SEARCH_SIMILARITY + result.similarity + and result.similarity > settings.MIN_SEARCH_SIMILARITY ) ) @@ -368,7 +416,7 @@ def test_citations_search(self): ### TEST FOREIGN KEY FIELD SEARCH ### ##################################### # Citation model's foreign key field(s): - keyword = 'book' + keyword = "book" reftype_results = Citations.keyword_search(keyword) self.assertEqual(reftype_results.count(), 1) self.assertTrue(11 in [x.pk for x in reftype_results]) @@ -379,7 +427,6 @@ def test_citations_search(self): # self.assertEqual(authortype_results.count(), 1) # self.assertTrue(11 in [x.pk for x in authortype_results]) - ####################################### ### TEST MODEL SET REFERENCE SEARCH ### ####################################### @@ -391,14 +438,14 @@ def test_citation_id_collision(self): Test that saving a citation can recover from an ID collision """ insertion_object = { - 'referencetype': LookupReferenceType.objects.all()[0], + "referencetype": LookupReferenceType.objects.all()[0], } collision_result = test_model_id_collision(Citations, insertion_object, self) self.assertTrue(collision_result) + # Media class MediaTest(ITKSearchTest): - def test_media(self): # print("Testing Media Model") # print("Total media: {}".format(Media.objects.all().count())) @@ -410,16 +457,16 @@ def test_media_search(self): ##################################### # fields: - keyword = 'sample' + keyword = "sample" media_results = Media.keyword_search(keyword) self.assertEqual(media_results.count(), 2) for result in media_results: - self.assertTrue(hasattr(result, 'similarity')) + self.assertTrue(hasattr(result, "similarity")) self.assertTrue( ( - result.similarity and - result.similarity > settings.MIN_SEARCH_SIMILARITY + result.similarity + and result.similarity > settings.MIN_SEARCH_SIMILARITY ) ) @@ -427,55 +474,62 @@ def test_media_id_collision(self): """ Test that saving a media can recover from an ID collision """ - insertion_object = { - } + insertion_object = {} collision_result = test_model_id_collision(Media, insertion_object, self) self.assertTrue(collision_result) + # MediaBulkUpload class MediaBulkUploadTest(ITKSearchTest): - def test_media_bulk_upload_id_collision(self): """ Test that saving a bulk upload record can recover from an ID collision """ - insertion_object = { - } + insertion_object = {} if MediaBulkUpload.objects.all().count() == 0: - MediaBulkUpload.objects.create(**{'pk':7}) + MediaBulkUpload.objects.create(**{"pk": 7}) self.assertTrue(MediaBulkUpload.objects.all().count() > 0) existing_bulk_record = MediaBulkUpload.objects.all()[0] self.assertTrue(existing_bulk_record.pk > 0) - collision_result = test_model_id_collision(MediaBulkUpload, insertion_object, self) + collision_result = test_model_id_collision( + MediaBulkUpload, insertion_object, self + ) self.assertTrue(collision_result) + #################################################### # Relationship Tests #################################################### # ResourceActivityMediaEvents ('Activity - Media') class ResourceActivityMediaEventsTest(ITKTestCase): - def test_activity_media_relationship_id_collision(self): """ Test that saving an activity-media relationship can recover from an ID collision """ - insertion_object = { - 'resourceactivityid': ResourcesActivityEvents.objects.all()[1], - 'mediaid': Media.objects.all()[1], + insertion_object = { + "resourceactivityid": ResourcesActivityEvents.objects.all()[1], + "mediaid": Media.objects.all()[1], } - if ResourceActivityMediaEvents.objects.all().count() == 0 or ResourceActivityMediaEvents.objects.all().order_by('-pk')[0].pk < 2: - ResourceActivityMediaEvents.objects.create(**{ - 'pk':2, - 'resourceactivityid': ResourcesActivityEvents.objects.all()[0], - 'mediaid': Media.objects.all()[0], - }) + if ( + ResourceActivityMediaEvents.objects.all().count() == 0 + or ResourceActivityMediaEvents.objects.all().order_by("-pk")[0].pk < 2 + ): + ResourceActivityMediaEvents.objects.create( + **{ + "pk": 2, + "resourceactivityid": ResourcesActivityEvents.objects.all()[0], + "mediaid": Media.objects.all()[0], + } + ) self.assertTrue(ResourceActivityMediaEvents.objects.all().count() > 0) - collision_result = test_model_id_collision(ResourceActivityMediaEvents, insertion_object, self) + collision_result = test_model_id_collision( + ResourceActivityMediaEvents, insertion_object, self + ) self.assertTrue(collision_result) + # ResourceActivityCitationEvents ('Activity - Sources') class ResourceActivityCitationEventsTest(ITKTestCase): - def test_activity_citation_relationship_id_collision(self): """ Test that saving an activity-source relationship can recover from an ID collision @@ -489,13 +543,15 @@ def test_activity_citation_relationship_id_collision(self): new_combo_2 = False for activity in activities: for citation in citations: - if ResourceActivityCitationEvents.objects.filter( - resourceactivityid=activity, - citationid=citation - ).count() == 0: - combo = { - 'resourceactivityid': activity, - 'citationid': citation, + if ( + ResourceActivityCitationEvents.objects.filter( + resourceactivityid=activity, citationid=citation + ).count() + == 0 + ): + combo = { + "resourceactivityid": activity, + "citationid": citation, } if not new_combo_1: new_combo_1 = combo @@ -505,62 +561,73 @@ def test_activity_citation_relationship_id_collision(self): break if new_combo_1 and new_combo_2: break - self.assertTrue(new_combo_1 != False) - self.assertTrue(new_combo_2 != False) + self.assertTrue(new_combo_1 is not False) + self.assertTrue(new_combo_2 is not False) self.assertTrue(new_combo_1 != new_combo_2) - + insertion_object = new_combo_2 - if ResourceActivityCitationEvents.objects.all().count() == 0 or ResourceActivityCitationEvents.objects.all().order_by('-pk')[0].pk < 2: - new_combo_1['pk'] = 2 + if ( + ResourceActivityCitationEvents.objects.all().count() == 0 + or ResourceActivityCitationEvents.objects.all().order_by("-pk")[0].pk < 2 + ): + new_combo_1["pk"] = 2 ResourceActivityCitationEvents.objects.create(**new_combo_1) self.assertTrue(ResourceActivityCitationEvents.objects.all().count() > 0) - collision_result = test_model_id_collision(ResourceActivityCitationEvents, insertion_object, self) + collision_result = test_model_id_collision( + ResourceActivityCitationEvents, insertion_object, self + ) self.assertTrue(collision_result) + # MediaCitationEvents ('Media - Sources') class MediaCitationEventsTest(ITKTestCase): - def test_media_citation_relationship_id_collision(self): """ Test that saving a media-citation relationship can recover from an ID collision """ - insertion_object = { - 'mediaid': Media.objects.all()[1], - 'citationid': Citations.objects.all()[1], + insertion_object = { + "mediaid": Media.objects.all()[1], + "citationid": Citations.objects.all()[1], } - if MediaCitationEvents.objects.all().count() == 0 or MediaCitationEvents.objects.all().order_by('-pk')[0].pk < 2: - MediaCitationEvents.objects.create(**{ - 'pk':2, - 'mediaid': Media.objects.all()[0], - 'citationid': Citations.objects.all()[0], - }) + if ( + MediaCitationEvents.objects.all().count() == 0 + or MediaCitationEvents.objects.all().order_by("-pk")[0].pk < 2 + ): + MediaCitationEvents.objects.create( + **{ + "pk": 2, + "mediaid": Media.objects.all()[0], + "citationid": Citations.objects.all()[0], + } + ) self.assertTrue(MediaCitationEvents.objects.all().count() > 0) - collision_result = test_model_id_collision(MediaCitationEvents, insertion_object, self) + collision_result = test_model_id_collision( + MediaCitationEvents, insertion_object, self + ) self.assertTrue(collision_result) -class MediaCitationEventsCascadeTest(ITKTestCase): +class MediaCitationEventsCascadeTest(ITKTestCase): def setUp(self): self.media = Media.objects.create( - medianame="Cascade Media", - mediadescription="Cascade Media Description" + medianame="Cascade Media", mediadescription="Cascade Media Description" ) self.citation = Citations.objects.create( referencetype=LookupReferenceType.objects.get(pk=1), - referencetext="Cascade Citation" + referencetext="Cascade Citation", ) self.event = MediaCitationEvents.objects.create( mediaid=self.media, citationid=self.citation, - relationshipdescription="Cascade Relationship" + relationshipdescription="Cascade Relationship", ) def test_cascade_delete_media(self): event_pks = list( - MediaCitationEvents.objects - .filter(mediaid=self.media) - .values_list('pk', flat=True) + MediaCitationEvents.objects.filter(mediaid=self.media).values_list( + "pk", flat=True + ) ) self.assertIn(self.event.pk, event_pks) total_before = MediaCitationEvents.objects.count() @@ -568,16 +635,16 @@ def test_cascade_delete_media(self): for pk in event_pks: self.assertFalse( MediaCitationEvents.objects.filter(pk=pk).exists(), - f"event {pk} should have been cascade‐deleted" + f"event {pk} should have been cascade‐deleted", ) total_after = MediaCitationEvents.objects.count() self.assertEqual(total_before - total_after, len(event_pks)) def test_cascade_delete_citation(self): event_pks = list( - MediaCitationEvents.objects - .filter(citationid=self.citation) - .values_list('pk', flat=True) + MediaCitationEvents.objects.filter(citationid=self.citation).values_list( + "pk", flat=True + ) ) self.assertIn(self.event.pk, event_pks) total_before = MediaCitationEvents.objects.count() @@ -585,95 +652,124 @@ def test_cascade_delete_citation(self): for pk in event_pks: self.assertFalse( MediaCitationEvents.objects.filter(pk=pk).exists(), - f"event {pk} should have been cascade‐deleted" + f"event {pk} should have been cascade‐deleted", ) total_after = MediaCitationEvents.objects.count() self.assertEqual(total_before - total_after, len(event_pks)) + # PlacesResourceMediaEvents ('Place-Resources - Media') class PlacesResourceMediaEventsTest(ITKTestCase): - def test_place_resource_media_relationship_id_collision(self): """ Test that saving a place-resource-media relationship can recover from an ID collision """ - insertion_object = { - 'placeresourceid': PlacesResourceEvents.objects.all()[1], - 'mediaid': Media.objects.all()[1], + insertion_object = { + "placeresourceid": PlacesResourceEvents.objects.all()[1], + "mediaid": Media.objects.all()[1], } - if PlacesResourceMediaEvents.objects.all().count() == 0 or PlacesResourceMediaEvents.objects.all().order_by('-pk')[0].pk < 2: - PlacesResourceMediaEvents.objects.create(**{ - 'pk':2, - 'placeresourceid': PlacesResourceEvents.objects.all()[0], - 'mediaid': Media.objects.all()[0], - }) + if ( + PlacesResourceMediaEvents.objects.all().count() == 0 + or PlacesResourceMediaEvents.objects.all().order_by("-pk")[0].pk < 2 + ): + PlacesResourceMediaEvents.objects.create( + **{ + "pk": 2, + "placeresourceid": PlacesResourceEvents.objects.all()[0], + "mediaid": Media.objects.all()[0], + } + ) self.assertTrue(PlacesResourceMediaEvents.objects.all().count() > 0) - collision_result = test_model_id_collision(PlacesResourceMediaEvents, insertion_object, self) + collision_result = test_model_id_collision( + PlacesResourceMediaEvents, insertion_object, self + ) self.assertTrue(collision_result) + # PlacesResourceCitationEvents ('Place-Resources - Sources') class PlacesResourceCitationEventsTest(ITKTestCase): - def test_place_resource_citation_relationship_id_collision(self): """ Test that saving a place-resource-citation relationship can recover from an ID collision """ - insertion_object = { - 'placeresourceid': PlacesResourceEvents.objects.all()[1], - 'citationid': Citations.objects.all()[1], + insertion_object = { + "placeresourceid": PlacesResourceEvents.objects.all()[1], + "citationid": Citations.objects.all()[1], } - if PlacesResourceCitationEvents.objects.all().count() == 0 or PlacesResourceCitationEvents.objects.all().order_by('-pk')[0].pk < 2: - PlacesResourceCitationEvents.objects.create(**{ - 'pk':2, - 'placeresourceid': PlacesResourceEvents.objects.all()[0], - 'citationid': Citations.objects.all()[0], - }) + if ( + PlacesResourceCitationEvents.objects.all().count() == 0 + or PlacesResourceCitationEvents.objects.all().order_by("-pk")[0].pk < 2 + ): + PlacesResourceCitationEvents.objects.create( + **{ + "pk": 2, + "placeresourceid": PlacesResourceEvents.objects.all()[0], + "citationid": Citations.objects.all()[0], + } + ) self.assertTrue(PlacesResourceCitationEvents.objects.all().count() > 0) - collision_result = test_model_id_collision(PlacesResourceCitationEvents, insertion_object, self) + collision_result = test_model_id_collision( + PlacesResourceCitationEvents, insertion_object, self + ) self.assertTrue(collision_result) + # PlaceAltIndigenousName ('Places - Alternative Name') class PlaceAltIndigenousNameTest(ITKTestCase): - def test_place_alt_indigenous_name_id_collision(self): """ Test that saving a place-alt-indigenous-name relationship can recover from an ID collision """ - insertion_object = { - 'placeid': Places.objects.all()[0], - 'altindigenousname': "Sample Alt Name 1", + insertion_object = { + "placeid": Places.objects.all()[0], + "altindigenousname": "Sample Alt Name 1", } - if PlaceAltIndigenousName.objects.all().count() == 0 or PlaceAltIndigenousName.objects.all().order_by('-pk')[0].pk < 2: - PlaceAltIndigenousName.objects.create(**{ - 'placeid': Places.objects.all()[0], - 'altindigenousnameid': 2, - 'altindigenousname': "Sample Alt Name 2", - }) + if ( + PlaceAltIndigenousName.objects.all().count() == 0 + or PlaceAltIndigenousName.objects.all().order_by("-pk")[0].pk < 2 + ): + PlaceAltIndigenousName.objects.create( + **{ + "placeid": Places.objects.all()[0], + "altindigenousnameid": 2, + "altindigenousname": "Sample Alt Name 2", + } + ) self.assertTrue(PlaceAltIndigenousName.objects.all().count() > 0) - collision_result = test_model_id_collision(PlaceAltIndigenousName, insertion_object, self) + collision_result = test_model_id_collision( + PlaceAltIndigenousName, insertion_object, self + ) self.assertTrue(collision_result) + # PlacesMediaEvents ('Places - Media') class PlacesMediaEventsTest(ITKTestCase): - def test_place_media_relationship_id_collision(self): """ Test that saving a place-media relationship can recover from an ID collision """ - insertion_object = { - 'placeid': Places.objects.all()[1], - 'mediaid': Media.objects.all()[1], + insertion_object = { + "placeid": Places.objects.all()[1], + "mediaid": Media.objects.all()[1], } - if PlacesMediaEvents.objects.all().count() == 0 or PlacesMediaEvents.objects.all().order_by('-pk')[0].pk < 2: - PlacesMediaEvents.objects.create(**{ - 'pk':2, - 'placeid': Places.objects.all()[0], - 'mediaid': Media.objects.all()[0], - }) + if ( + PlacesMediaEvents.objects.all().count() == 0 + or PlacesMediaEvents.objects.all().order_by("-pk")[0].pk < 2 + ): + PlacesMediaEvents.objects.create( + **{ + "pk": 2, + "placeid": Places.objects.all()[0], + "mediaid": Media.objects.all()[0], + } + ) self.assertTrue(PlacesMediaEvents.objects.all().count() > 0) - collision_result = test_model_id_collision(PlacesMediaEvents, insertion_object, self) + collision_result = test_model_id_collision( + PlacesMediaEvents, insertion_object, self + ) self.assertTrue(collision_result) + class PlacesMediaEventsCascadeTest(ITKTestCase): def setUp(self): # Create a Places instance @@ -683,23 +779,22 @@ def setUp(self): ) # Create a Media instance self.media = Media.objects.create( - medianame="Test Media", - mediadescription="Test Media Description" + medianame="Test Media", mediadescription="Test Media Description" ) # Create a PlacesMediaEvents instance self.places_media_event = PlacesMediaEvents.objects.create( placeid=self.place, mediaid=self.media, - relationshipdescription="Test Relationship" + relationshipdescription="Test Relationship", ) - def test_cascade_delete_place(self): + def test_cascade_delete_place(self): # grab the PKs of all events for our test place event_pks = list( - PlacesMediaEvents.objects - .filter(placeid=self.place) - .values_list('pk', flat=True) + PlacesMediaEvents.objects.filter(placeid=self.place).values_list( + "pk", flat=True + ) ) self.assertIn(self.places_media_event.pk, event_pks) @@ -714,7 +809,7 @@ def test_cascade_delete_place(self): for pk in event_pks: self.assertFalse( PlacesMediaEvents.objects.filter(pk=pk).exists(), - f"event {pk} should have been cascade‐deleted" + f"event {pk} should have been cascade‐deleted", ) # and total should have dropped by exactly len(event_pks) @@ -723,47 +818,55 @@ def test_cascade_delete_place(self): def test_cascade_delete_media(self): media_pks = list( - PlacesMediaEvents.objects - .filter(mediaid=self.media) - .values_list('pk', flat=True) + PlacesMediaEvents.objects.filter(mediaid=self.media).values_list( + "pk", flat=True + ) ) self.assertIn(self.places_media_event.pk, media_pks) total_before = PlacesMediaEvents.objects.count() - + # Delete the Media instance self.media.delete() for pk in media_pks: self.assertFalse( PlacesMediaEvents.objects.filter(pk=pk).exists(), - f"event {pk} should have been cascade‐deleted" + f"event {pk} should have been cascade‐deleted", ) total_after = PlacesMediaEvents.objects.count() self.assertEqual(total_before - total_after, len(media_pks)) + # PlacesResourceEvents ('Places - Resources') class PlacesResourceEventsTest(ITKTestCase): - def test_place_resource_relationship_id_collision(self): """ Test that saving a place-resource relationship can recover from an ID collision """ - insertion_object = { - 'placeid': Places.objects.all()[1], - 'resourceid': Resources.objects.all()[1], + insertion_object = { + "placeid": Places.objects.all()[1], + "resourceid": Resources.objects.all()[1], } - if PlacesResourceEvents.objects.all().count() == 0 or PlacesResourceEvents.objects.all().order_by('-pk')[0].pk < 2: - PlacesResourceEvents.objects.create(**{ - 'pk':2, - 'placeid': Places.objects.all()[0], - 'resourceid': Resources.objects.all()[0], - }) + if ( + PlacesResourceEvents.objects.all().count() == 0 + or PlacesResourceEvents.objects.all().order_by("-pk")[0].pk < 2 + ): + PlacesResourceEvents.objects.create( + **{ + "pk": 2, + "placeid": Places.objects.all()[0], + "resourceid": Resources.objects.all()[0], + } + ) self.assertTrue(PlacesResourceEvents.objects.all().count() > 0) - collision_result = test_model_id_collision(PlacesResourceEvents, insertion_object, self) + collision_result = test_model_id_collision( + PlacesResourceEvents, insertion_object, self + ) self.assertTrue(collision_result) + class PlacesResourceEventsCascadeTest(ITKTestCase): # fixtures = ['/usr/local/apps/TEKDB/TEKDB/TEKDB/fixtures/all_dummy_data.json',] @@ -773,20 +876,19 @@ def setUp(self): englishplacename="Cascade Place English", ) self.resource = Resources.objects.create( - commonname="Cascade Resource", - indigenousname="Cascade Indigenous Resource" + commonname="Cascade Resource", indigenousname="Cascade Indigenous Resource" ) self.event = PlacesResourceEvents.objects.create( placeid=self.place, resourceid=self.resource, - relationshipdescription="Cascade Relationship" + relationshipdescription="Cascade Relationship", ) def test_cascade_delete_place(self): event_pks = list( - PlacesResourceEvents.objects - .filter(placeid=self.place) - .values_list('pk', flat=True) + PlacesResourceEvents.objects.filter(placeid=self.place).values_list( + "pk", flat=True + ) ) self.assertIn(self.event.pk, event_pks) total_before = PlacesResourceEvents.objects.count() @@ -794,16 +896,16 @@ def test_cascade_delete_place(self): for pk in event_pks: self.assertFalse( PlacesResourceEvents.objects.filter(pk=pk).exists(), - f"event {pk} should have been cascade‐deleted" + f"event {pk} should have been cascade‐deleted", ) total_after = PlacesResourceEvents.objects.count() self.assertEqual(total_before - total_after, len(event_pks)) def test_cascade_delete_resource(self): event_pks = list( - PlacesResourceEvents.objects - .filter(resourceid=self.resource) - .values_list('pk', flat=True) + PlacesResourceEvents.objects.filter(resourceid=self.resource).values_list( + "pk", flat=True + ) ) self.assertIn(self.event.pk, event_pks) total_before = PlacesResourceEvents.objects.count() @@ -811,34 +913,41 @@ def test_cascade_delete_resource(self): for pk in event_pks: self.assertFalse( PlacesResourceEvents.objects.filter(pk=pk).exists(), - f"event {pk} should have been cascade‐deleted" + f"event {pk} should have been cascade‐deleted", ) total_after = PlacesResourceEvents.objects.count() self.assertEqual(total_before - total_after, len(event_pks)) + # PlacesCitationEvents ('Places - Sources') class PlacesCitationEventsTest(ITKTestCase): - def test_place_citation_relationship_id_collision(self): """ Test that saving a place-citation relationship can recover from an ID collision """ - insertion_object = { - 'placeid': Places.objects.all()[1], - 'citationid': Citations.objects.all()[1], + insertion_object = { + "placeid": Places.objects.all()[1], + "citationid": Citations.objects.all()[1], } - if PlacesCitationEvents.objects.all().count() == 0 or PlacesCitationEvents.objects.all().order_by('-pk')[0].pk < 2: - PlacesCitationEvents.objects.create(**{ - 'pk':2, - 'placeid': Places.objects.all()[0], - 'citationid': Citations.objects.all()[0], - }) + if ( + PlacesCitationEvents.objects.all().count() == 0 + or PlacesCitationEvents.objects.all().order_by("-pk")[0].pk < 2 + ): + PlacesCitationEvents.objects.create( + **{ + "pk": 2, + "placeid": Places.objects.all()[0], + "citationid": Citations.objects.all()[0], + } + ) self.assertTrue(PlacesCitationEvents.objects.all().count() > 0) - collision_result = test_model_id_collision(PlacesCitationEvents, insertion_object, self) + collision_result = test_model_id_collision( + PlacesCitationEvents, insertion_object, self + ) self.assertTrue(collision_result) -class PlacesCitationEventsCascadeTest(ITKTestCase): +class PlacesCitationEventsCascadeTest(ITKTestCase): def setUp(self): self.place = Places.objects.create( indigenousplacename="Cascade Place", @@ -846,19 +955,19 @@ def setUp(self): ) self.citation = Citations.objects.create( referencetext="Cascade Citation", - referencetype=LookupReferenceType.objects.create(documenttype="Book") + referencetype=LookupReferenceType.objects.create(documenttype="Book"), ) self.event = PlacesCitationEvents.objects.create( placeid=self.place, citationid=self.citation, - relationshipdescription="Cascade Relationship" + relationshipdescription="Cascade Relationship", ) def test_cascade_delete_place(self): event_pks = list( - PlacesCitationEvents.objects - .filter(placeid=self.place) - .values_list('pk', flat=True) + PlacesCitationEvents.objects.filter(placeid=self.place).values_list( + "pk", flat=True + ) ) self.assertIn(self.event.pk, event_pks) total_before = PlacesCitationEvents.objects.count() @@ -866,16 +975,16 @@ def test_cascade_delete_place(self): for pk in event_pks: self.assertFalse( PlacesCitationEvents.objects.filter(pk=pk).exists(), - f"event {pk} should have been cascade‐deleted" + f"event {pk} should have been cascade‐deleted", ) total_after = PlacesCitationEvents.objects.count() self.assertEqual(total_before - total_after, len(event_pks)) def test_cascade_delete_citation(self): event_pks = list( - PlacesCitationEvents.objects - .filter(citationid=self.citation) - .values_list('pk', flat=True) + PlacesCitationEvents.objects.filter(citationid=self.citation).values_list( + "pk", flat=True + ) ) self.assertIn(self.event.pk, event_pks) total_before = PlacesCitationEvents.objects.count() @@ -883,116 +992,147 @@ def test_cascade_delete_citation(self): for pk in event_pks: self.assertFalse( PlacesCitationEvents.objects.filter(pk=pk).exists(), - f"event {pk} should have been cascade‐deleted" + f"event {pk} should have been cascade‐deleted", ) total_after = PlacesCitationEvents.objects.count() self.assertEqual(total_before - total_after, len(event_pks)) + # ResourceAltIndigenousName ('Resource Alternative Names') class ResourceAltIndigenousNameTest(ITKTestCase): - def test_resource_alt_indigenous_name_id_collision(self): """ Test that saving a resource-alt-indigenous-name relationship can recover from an ID collision """ - insertion_object = { - 'resourceid': Resources.objects.all()[0], - 'altindigenousname': "Sample Alt Name 1", + insertion_object = { + "resourceid": Resources.objects.all()[0], + "altindigenousname": "Sample Alt Name 1", } - if ResourceAltIndigenousName.objects.all().count() == 0 or ResourceAltIndigenousName.objects.all().order_by('-pk')[0].pk < 2: - ResourceAltIndigenousName.objects.create(**{ - 'resourceid': Resources.objects.all()[0], - 'altindigenousnameid': 2, - 'altindigenousname': "Sample Alt Name 2", - }) + if ( + ResourceAltIndigenousName.objects.all().count() == 0 + or ResourceAltIndigenousName.objects.all().order_by("-pk")[0].pk < 2 + ): + ResourceAltIndigenousName.objects.create( + **{ + "resourceid": Resources.objects.all()[0], + "altindigenousnameid": 2, + "altindigenousname": "Sample Alt Name 2", + } + ) self.assertTrue(ResourceAltIndigenousName.objects.all().count() > 0) - collision_result = test_model_id_collision(ResourceAltIndigenousName, insertion_object, self) + collision_result = test_model_id_collision( + ResourceAltIndigenousName, insertion_object, self + ) self.assertTrue(collision_result) + # ResourcesMediaEvents ('Resources - Media') class ResourcesMediaEventsTest(ITKTestCase): - def test_resource_media_relationship_id_collision(self): """ Test that saving a resource-media relationship can recover from an ID collision """ - insertion_object = { - 'resourceid': Resources.objects.all()[1], - 'mediaid': Media.objects.all()[1], + insertion_object = { + "resourceid": Resources.objects.all()[1], + "mediaid": Media.objects.all()[1], } - if ResourcesMediaEvents.objects.all().count() == 0 or ResourcesMediaEvents.objects.all().order_by('-pk')[0].pk < 2: - ResourcesMediaEvents.objects.create(**{ - 'pk':2, - 'resourceid': Resources.objects.all()[0], - 'mediaid': Media.objects.all()[0], - }) + if ( + ResourcesMediaEvents.objects.all().count() == 0 + or ResourcesMediaEvents.objects.all().order_by("-pk")[0].pk < 2 + ): + ResourcesMediaEvents.objects.create( + **{ + "pk": 2, + "resourceid": Resources.objects.all()[0], + "mediaid": Media.objects.all()[0], + } + ) self.assertTrue(ResourcesMediaEvents.objects.all().count() > 0) - collision_result = test_model_id_collision(ResourcesMediaEvents, insertion_object, self) + collision_result = test_model_id_collision( + ResourcesMediaEvents, insertion_object, self + ) self.assertTrue(collision_result) + # ResourceResourceEvents ('Resources - Resources') class ResourceResourceEventsTest(ITKTestCase): - def test_resource_resource_relationship_id_collision(self): """ Test that saving a resource-resource relationship can recover from an ID collision """ - insertion_object = { - 'resourceid': Resources.objects.all()[1], - 'altresourceid': Resources.objects.all()[0], + insertion_object = { + "resourceid": Resources.objects.all()[1], + "altresourceid": Resources.objects.all()[0], } - if ResourceResourceEvents.objects.all().count() == 0 or ResourceResourceEvents.objects.all().order_by('-pk')[0].pk < 2: - ResourceResourceEvents.objects.create(**{ - 'pk':2, - 'resourceid': Resources.objects.all()[2], - 'altresourceid': Resources.objects.all()[0], - }) + if ( + ResourceResourceEvents.objects.all().count() == 0 + or ResourceResourceEvents.objects.all().order_by("-pk")[0].pk < 2 + ): + ResourceResourceEvents.objects.create( + **{ + "pk": 2, + "resourceid": Resources.objects.all()[2], + "altresourceid": Resources.objects.all()[0], + } + ) self.assertTrue(ResourceResourceEvents.objects.all().count() > 0) - collision_result = test_model_id_collision(ResourceResourceEvents, insertion_object, self) + collision_result = test_model_id_collision( + ResourceResourceEvents, insertion_object, self + ) self.assertTrue(collision_result) + # ResourcesCitationEvents ('Resources - Sources') class ResourcesCitationEventsTest(ITKTestCase): - def test_resource_citation_relationship_id_collision(self): """ Test that saving a resource-citation relationship can recover from an ID collision """ - insertion_object = { - 'resourceid': Resources.objects.all()[1], - 'citationid': Citations.objects.all()[1], + insertion_object = { + "resourceid": Resources.objects.all()[1], + "citationid": Citations.objects.all()[1], } - if ResourcesCitationEvents.objects.all().count() == 0 or ResourcesCitationEvents.objects.all().order_by('-pk')[0].pk < 2: - ResourcesCitationEvents.objects.create(**{ - 'pk':2, - 'resourceid': Resources.objects.all()[0], - 'citationid': Citations.objects.all()[0], - }) + if ( + ResourcesCitationEvents.objects.all().count() == 0 + or ResourcesCitationEvents.objects.all().order_by("-pk")[0].pk < 2 + ): + ResourcesCitationEvents.objects.create( + **{ + "pk": 2, + "resourceid": Resources.objects.all()[0], + "citationid": Citations.objects.all()[0], + } + ) self.assertTrue(ResourcesCitationEvents.objects.all().count() > 0) - collision_result = test_model_id_collision(ResourcesCitationEvents, insertion_object, self) + collision_result = test_model_id_collision( + ResourcesCitationEvents, insertion_object, self + ) self.assertTrue(collision_result) -# LocalityPlaceResourceEvent +# LocalityPlaceResourceEvent #################################################### # Lookup Tests #################################################### + # LookupActivity class LookupActivityTest(ITKTestCase): - def test_lookup_activity_id_collision(self): """ Test that saving a lookup activity can recover from an ID collision """ insertion_object = { - 'activity': 'Testing', + "activity": "Testing", } - collision_result = test_model_id_collision(LookupActivity, insertion_object, self) + collision_result = test_model_id_collision( + LookupActivity, insertion_object, self + ) self.assertTrue(collision_result) + # LookupAuthorType class LookupAuthorTypeTest(ITKTestCase): def test_lookup_author_type_id_collision(self): @@ -1000,11 +1140,14 @@ def test_lookup_author_type_id_collision(self): Test that saving a lookup author type can recover from an ID collision """ insertion_object = { - 'authortype': 'Testing', + "authortype": "Testing", } - collision_result = test_model_id_collision(LookupAuthorType, insertion_object, self) + collision_result = test_model_id_collision( + LookupAuthorType, insertion_object, self + ) self.assertTrue(collision_result) + # LookupCustomaryUse class LookupCustomaryUseTest(ITKTestCase): def test_lookup_customary_use_id_collision(self): @@ -1012,11 +1155,14 @@ def test_lookup_customary_use_id_collision(self): Test that saving a lookup customary use can recover from an ID collision """ insertion_object = { - 'usedfor': 'Testing', + "usedfor": "Testing", } - collision_result = test_model_id_collision(LookupCustomaryUse, insertion_object, self) + collision_result = test_model_id_collision( + LookupCustomaryUse, insertion_object, self + ) self.assertTrue(collision_result) + # LookupHabitat class LookupHabitatTest(ITKTestCase): def test_lookup_habitat_id_collision(self): @@ -1024,11 +1170,14 @@ def test_lookup_habitat_id_collision(self): Test that saving a lookup habitat can recover from an ID collision """ insertion_object = { - 'habitat': 'Testing', + "habitat": "Testing", } - collision_result = test_model_id_collision(LookupHabitat, insertion_object, self) + collision_result = test_model_id_collision( + LookupHabitat, insertion_object, self + ) self.assertTrue(collision_result) + # LookupMediaType class LookupMediaTypeTest(ITKTestCase): def test_lookup_media_type_search(self): @@ -1039,17 +1188,17 @@ def test_lookup_media_type_search(self): # char fields: # * mediatype # * mediacategory - keyword = 'Aud' + keyword = "Aud" search_results = LookupMediaType.keyword_search(keyword) # do we get 1 result? also checks that we do not return all results in Place category self.assertEqual(search_results.count(), 1) # checkout results belong to one of the search fields for result in search_results: - if hasattr(result, 'similarity'): + if hasattr(result, "similarity"): self.assertTrue( ( - result.similarity and - result.similarity > settings.MIN_SEARCH_SIMILARITY + result.similarity + and result.similarity > settings.MIN_SEARCH_SIMILARITY ) ) @@ -1058,11 +1207,14 @@ def test_lookup_media_type_id_collision(self): Test that saving a lookup media type can recover from an ID collision """ insertion_object = { - 'mediatype': 'Testing', + "mediatype": "Testing", } - collision_result = test_model_id_collision(LookupMediaType, insertion_object, self) + collision_result = test_model_id_collision( + LookupMediaType, insertion_object, self + ) self.assertTrue(collision_result) + # LookupParticipants class LookupParticipantsTest(ITKTestCase): def test_lookup_participants_id_collision(self): @@ -1070,11 +1222,14 @@ def test_lookup_participants_id_collision(self): Test that saving a lookup participants can recover from an ID collision """ insertion_object = { - 'participants': 'Testing', + "participants": "Testing", } - collision_result = test_model_id_collision(LookupParticipants, insertion_object, self) + collision_result = test_model_id_collision( + LookupParticipants, insertion_object, self + ) self.assertTrue(collision_result) + # LookupPartUsed class LookupPartUsedTest(ITKTestCase): def test_lookup_part_used_id_collision(self): @@ -1082,11 +1237,14 @@ def test_lookup_part_used_id_collision(self): Test that saving a lookup part used can recover from an ID collision """ insertion_object = { - 'partused': 'Testing', + "partused": "Testing", } - collision_result = test_model_id_collision(LookupPartUsed, insertion_object, self) + collision_result = test_model_id_collision( + LookupPartUsed, insertion_object, self + ) self.assertTrue(collision_result) + # People class PeopleTest(ITKSearchTest): def test_people_search(self): @@ -1099,17 +1257,17 @@ def test_people_search(self): # * lastname # * village # * relationshiptootherpeople - keyword = 'Mana' + keyword = "Mana" search_results = People.keyword_search(keyword) # do we get 1 result? also checks that we do not return all results in Place category self.assertEqual(search_results.count(), 1) # checkout results belong to one of the search fields for result in search_results: - if hasattr(result, 'similarity'): + if hasattr(result, "similarity"): self.assertTrue( ( - result.similarity and - result.similarity > settings.MIN_SEARCH_SIMILARITY + result.similarity + and result.similarity > settings.MIN_SEARCH_SIMILARITY ) ) @@ -1118,25 +1276,28 @@ def test_people_id_collision(self): Test that saving a people can recover from an ID collision """ insertion_object = { - 'firstname': 'Testing', - 'lastname': 'Person', + "firstname": "Testing", + "lastname": "Person", } collision_result = test_model_id_collision(People, insertion_object, self) self.assertTrue(collision_result) + # LookupPlanningUnit class LookupPlanningUnitTest(ITKTestCase): - def test_planning_unit_id_collision(self): """ Test that saving a planning unit can recover from an ID collision """ insertion_object = { - 'planningunitname': 'Testing', + "planningunitname": "Testing", } - collision_result = test_model_id_collision(LookupPlanningUnit, insertion_object, self) + collision_result = test_model_id_collision( + LookupPlanningUnit, insertion_object, self + ) self.assertTrue(collision_result) + # LookupReferenceType class LookupReferenceTypeTest(ITKTestCase): def test_lokup_reference_type_id_collision(self): @@ -1144,11 +1305,14 @@ def test_lokup_reference_type_id_collision(self): Test that saving a reference type lookup can recover from an ID collision """ insertion_object = { - 'documenttype': 'Testing', + "documenttype": "Testing", } - collision_result = test_model_id_collision(LookupReferenceType, insertion_object, self) + collision_result = test_model_id_collision( + LookupReferenceType, insertion_object, self + ) self.assertTrue(collision_result) + # LookupResourceGroup class LookupResourceGroupTest(ITKTestCase): def test_lookup_resource_group_id_collision(self): @@ -1156,11 +1320,14 @@ def test_lookup_resource_group_id_collision(self): Test that saving a resource group lookup can recover from an ID collision """ insertion_object = { - 'resourceclassificationgroup': 'Testing', + "resourceclassificationgroup": "Testing", } - collision_result = test_model_id_collision(LookupResourceGroup, insertion_object, self) + collision_result = test_model_id_collision( + LookupResourceGroup, insertion_object, self + ) self.assertTrue(collision_result) + # LookupSeason class LookupSeasonTest(ITKTestCase): def test_lookup_season_id_collision(self): @@ -1168,11 +1335,12 @@ def test_lookup_season_id_collision(self): Test that saving a season lookup can recover from an ID collision """ insertion_object = { - 'season': 'Testing', + "season": "Testing", } collision_result = test_model_id_collision(LookupSeason, insertion_object, self) self.assertTrue(collision_result) + # LookupTechniques class LookupTechniquesTest(ITKTestCase): def test_lookup_technique_id_collision(self): @@ -1180,11 +1348,14 @@ def test_lookup_technique_id_collision(self): Test that saving a technique lookup can recover from an ID collision """ insertion_object = { - 'techniques': 'Testing', + "techniques": "Testing", } - collision_result = test_model_id_collision(LookupTechniques, insertion_object, self) + collision_result = test_model_id_collision( + LookupTechniques, insertion_object, self + ) self.assertTrue(collision_result) + # LookupTiming class LookupTimingTest(ITKTestCase): def test_lookup_timing_id_collision(self): @@ -1192,11 +1363,12 @@ def test_lookup_timing_id_collision(self): Test that saving a timing lookup can recover from an ID collision """ insertion_object = { - 'timing': 'Testing', + "timing": "Testing", } collision_result = test_model_id_collision(LookupTiming, insertion_object, self) self.assertTrue(collision_result) + # LookupTribe class LookupTribeTest(ITKTestCase): def test_people_search(self): @@ -1208,17 +1380,17 @@ def test_people_search(self): # * tribeunit # * tribe # * federaltribe - keyword = 'Rancheria' + keyword = "Rancheria" search_results = LookupTribe.keyword_search(keyword) # do we get 1 result? also checks that we do not return all results in Place category self.assertEqual(search_results.count(), 1) # checkout results belong to one of the search fields for result in search_results: - if hasattr(result, 'similarity'): + if hasattr(result, "similarity"): self.assertTrue( ( - result.similarity and - result.similarity > settings.MIN_SEARCH_SIMILARITY + result.similarity + and result.similarity > settings.MIN_SEARCH_SIMILARITY ) ) @@ -1227,21 +1399,27 @@ def test_lookup_tribe_id_collision(self): Test that saving a tribe lookup can recover from an ID collision """ insertion_object = { - 'tribeunit': 'Subunit', - 'tribe' : 'Tribe', - 'federaltribe': 'Government' + "tribeunit": "Subunit", + "tribe": "Tribe", + "federaltribe": "Government", } - if LookupTribe.objects.all().count() == 0 or LookupTribe.objects.all().order_by('-pk')[0].pk < 2: - LookupTribe.objects.create(**{ - 'pk':2, - 'tribeunit': 'Subunit1', - 'tribe' : 'Tribe1', - 'federaltribe': 'Government1' - }) + if ( + LookupTribe.objects.all().count() == 0 + or LookupTribe.objects.all().order_by("-pk")[0].pk < 2 + ): + LookupTribe.objects.create( + **{ + "pk": 2, + "tribeunit": "Subunit1", + "tribe": "Tribe1", + "federaltribe": "Government1", + } + ) self.assertTrue(LookupTribe.objects.all().count() > 0) collision_result = test_model_id_collision(LookupTribe, insertion_object, self) self.assertTrue(collision_result) + # LookupUserInfo class LookupUserInfoTest(ITKTestCase): def test_lookup_user_inf_id_collision(self): @@ -1249,19 +1427,26 @@ def test_lookup_user_inf_id_collision(self): Test that saving a user info lookup can recover from an ID collision """ insertion_object = { - 'username': 'Name', - 'usertitle' : 'Title', - 'useraffiliation': 'Affiliation' + "username": "Name", + "usertitle": "Title", + "useraffiliation": "Affiliation", } - if LookupUserInfo.objects.all().count() == 0 or LookupUserInfo.objects.all().order_by('-pk')[0].pk < 2: - LookupUserInfo.objects.create(**{ - 'pk':2, - 'username': 'Name1', - 'usertitle' : 'Title1', - 'useraffiliation': 'Affiliation1' - }) + if ( + LookupUserInfo.objects.all().count() == 0 + or LookupUserInfo.objects.all().order_by("-pk")[0].pk < 2 + ): + LookupUserInfo.objects.create( + **{ + "pk": 2, + "username": "Name1", + "usertitle": "Title1", + "useraffiliation": "Affiliation1", + } + ) self.assertTrue(LookupUserInfo.objects.all().count() > 0) - collision_result = test_model_id_collision(LookupUserInfo, insertion_object, self) + collision_result = test_model_id_collision( + LookupUserInfo, insertion_object, self + ) self.assertTrue(collision_result) @@ -1273,7 +1458,3 @@ def test_lookup_user_inf_id_collision(self): #################################################### # Locality - - - - diff --git a/TEKDB/TEKDB/tests/test_views.py b/TEKDB/TEKDB/tests/test_views.py index 5a03c4e1..eee995bb 100644 --- a/TEKDB/TEKDB/tests/test_views.py +++ b/TEKDB/TEKDB/tests/test_views.py @@ -4,18 +4,28 @@ from django.contrib.auth.models import AnonymousUser from django.contrib.contenttypes.models import ContentType from django.core.files.uploadedfile import InMemoryUploadedFile -from django.db import connection from django.test import TestCase, TransactionTestCase from django.test.client import RequestFactory from django.urls import reverse + # from django.utils import timezone import hashlib import json from os import listdir, remove, sep from os.path import isfile, isdir, join, split, getsize import shutil + # from TEKDB.forms import * -from TEKDB.models import * +from TEKDB.models import ( + Citations, + LookupReferenceType, + Media, + Places, + PlacesResourceEvents, + Resources, + ResourcesActivityEvents, + Users, +) from TEKDB.views import ExportDatabase, ImportDatabase import tempfile import zipfile @@ -25,6 +35,7 @@ # coverage run manage.py test TEKDB -v 2 ######################################################################### + # Courtesy of DelftStack: https://www.delftstack.com/howto/python/python-checksum/#use-the-os-module-to-generate-and-check-the-checksum-of-an-md5-file-in-python def get_checksum(filename, hash_function): hash_function = hash_function.lower() @@ -35,34 +46,32 @@ def get_checksum(filename, hash_function): readable_hash = hashlib.md5(bytes).hexdigest() else: - Raise("{} is an invalid hash function. Please Enter MD5 value") + raise ValueError("{} is an invalid hash function. Please Enter MD5 value") return readable_hash + def create_export_request(self): return self.factory.get( - reverse('export_database'), - headers={ - "Authorization": f"Basic {self.credentials}" - }, + reverse("export_database"), + headers={"Authorization": f"Basic {self.credentials}"}, ) + def create_get_related_request(self, model, id): return self.factory.get( - f'tekdb/{model}/{id}/get_related', - headers={ - "Authorization": f"Basic {self.credentials}" - }, + f"tekdb/{model}/{id}/get_related", + headers={"Authorization": f"Basic {self.credentials}"}, ) + def get_export_file_from_response(response, tempdir=False, datestamp=False): if not tempdir: tempdir = tempfile.gettempdir() if not datestamp: - datestamp = datetime.now().strftime('%Y%m%d') + datestamp = datetime.now().strftime("%Y%m%d") zipname = join(tempdir, "{}_backup.zip".format(datestamp)) - fileresponse = bytes('test', 'utf-8') - stream = b''.join(response.streaming_content) + stream = b"".join(response.streaming_content) with open(zipname, "wb") as f: f.write(stream) @@ -71,74 +80,94 @@ def get_export_file_from_response(response, tempdir=False, datestamp=False): return zipname + def get_content_type_map(import_cts): ct_map = {} model_map = {} for ct in import_cts: - ct_map[ct['pk']] = { - 'import': { - 'model': ct['fields']['model'], - 'app_label': ct['fields']['app_label'] + ct_map[ct["pk"]] = { + "import": { + "model": ct["fields"]["model"], + "app_label": ct["fields"]["app_label"], } } - model_map["{}__{}".format(ct['fields']['app_label'],ct['fields']['model'])] = ct['pk'] + model_map["{}__{}".format(ct["fields"]["app_label"], ct["fields"]["model"])] = ( + ct["pk"] + ) for ct in ContentType.objects.all(): key = "{}__{}".format(ct.app_label, ct.model) if key in model_map.keys(): - ct_map[model_map[key]]['existing_pk'] = ct.pk - + ct_map[model_map[key]]["existing_pk"] = ct.pk + return ct_map + def get_perm_map(import_perms): from django.contrib.auth.models import Permission + perm_map = {} for perm in import_perms: - new_perm = Permission.objects.get(content_type_id=perm['fields']['content_type'], codename=perm['fields']['codename']) - perm_map[perm['pk']] = { - 'import': { - 'codename': perm['fields']['codename'], - 'content_type': perm['fields']['content_type'], - 'name': perm['fields']['name'] + new_perm = Permission.objects.get( + content_type_id=perm["fields"]["content_type"], + codename=perm["fields"]["codename"], + ) + perm_map[perm["pk"]] = { + "import": { + "codename": perm["fields"]["codename"], + "content_type": perm["fields"]["content_type"], + "name": perm["fields"]["name"], }, - 'existing_pk': new_perm.pk + "existing_pk": new_perm.pk, } - + return perm_map + def update_json_content_types(json_dict): import_cts = [] import_perms = [] - len_json_dict = len(json_dict) for record in json_dict: - if record['model'] == 'contenttypes.contenttype': + if record["model"] == "contenttypes.contenttype": import_cts.append(record) - if record['model'] == 'auth.permission': + if record["model"] == "auth.permission": import_perms.append(record) for record in import_cts: json_dict.remove(record) for record in import_perms: json_dict.remove(record) - + ct_map = get_content_type_map(import_cts) - for (index, record) in enumerate(import_perms): - if 'fields' in import_perms[index].keys() and 'content_type' in import_perms[index]['fields'].keys(): - import_perms[index]['fields']['content_type'] = ct_map[record['fields']['content_type']]['existing_pk'] + for index, record in enumerate(import_perms): + if ( + "fields" in import_perms[index].keys() + and "content_type" in import_perms[index]["fields"].keys() + ): + import_perms[index]["fields"]["content_type"] = ct_map[ + record["fields"]["content_type"] + ]["existing_pk"] perm_map = get_perm_map(import_perms) - for (index, record) in enumerate(json_dict): - if 'fields' in json_dict[index].keys(): - if 'content_type' in json_dict[index]['fields'].keys(): - json_dict[index]['fields']['content_type'] = ct_map[record['fields']['content_type']]['existing_pk'] - if 'permissions' in json_dict[index]['fields'].keys(): - for (perm_index, perm) in enumerate(json_dict[index]['fields']['permissions']): + for index, record in enumerate(json_dict): + if "fields" in json_dict[index].keys(): + if "content_type" in json_dict[index]["fields"].keys(): + json_dict[index]["fields"]["content_type"] = ct_map[ + record["fields"]["content_type"] + ]["existing_pk"] + if "permissions" in json_dict[index]["fields"].keys(): + for perm_index, perm in enumerate( + json_dict[index]["fields"]["permissions"] + ): if perm in perm_map.keys(): - json_dict[index]['fields']['permissions'][perm_index] = perm_map[perm]['existing_pk'] + json_dict[index]["fields"]["permissions"][perm_index] = ( + perm_map[perm]["existing_pk"] + ) return json_dict + def import_fixture_file(filepath): # Even test databases seem to pre-populate themselves with permissions and content types # * This is a problem when importing fixtures that have been exported from a database that has @@ -146,27 +175,32 @@ def import_fixture_file(filepath): # functions attempt to fix this. from django.core.management import call_command from tempfile import NamedTemporaryFile + with open(filepath) as json_in: json_dict = json.load(json_in) json_dict = update_json_content_types(json_dict) - tempfile = NamedTemporaryFile(suffix='.json', delete=False) - with open(tempfile.name, 'w') as json_out: + tempfile = NamedTemporaryFile(suffix=".json", delete=False) + with open(tempfile.name, "w") as json_out: json.dump(json_dict, json_out) - call_command('loaddata', tempfile.name) + call_command("loaddata", tempfile.name) remove(tempfile.name) class RelatedTest(TestCase): # fixtures = ['TEKDB/fixtures/all_dummy_data.json',] def setUp(self): - import_fixture_file(join(settings.BASE_DIR, 'TEKDB', 'fixtures', 'all_dummy_data.json')) + import_fixture_file( + join(settings.BASE_DIR, "TEKDB", "fixtures", "all_dummy_data.json") + ) self.factory = RequestFactory() self.credentials = b64encode(b"admin:admin").decode("ascii") # add a resource to the db - new_resource_record = Resources.objects.create(commonname="Dummy Record 1",) + new_resource_record = Resources.objects.create( + commonname="Dummy Record 1", + ) new_resource_record.save() self.first_resource = new_resource_record @@ -176,22 +210,36 @@ def setUp(self): self.first_place = new_place_record # add a place-resource event to the db - new_place_resource_event = PlacesResourceEvents.objects.create(placeid=new_place_record, resourceid=new_resource_record, relationshipdescription="A Dummy Place-Resource Event") + new_place_resource_event = PlacesResourceEvents.objects.create( + placeid=new_place_record, + resourceid=new_resource_record, + relationshipdescription="A Dummy Place-Resource Event", + ) new_place_resource_event.save() self.first_place_resource_event = new_place_resource_event # add a resource-activity event to the db - new_resources_activity_event = ResourcesActivityEvents.objects.create(placeresourceid=new_place_resource_event, relationshipdescription="A Dummy Resources Activity Event") + new_resources_activity_event = ResourcesActivityEvents.objects.create( + placeresourceid=new_place_resource_event, + relationshipdescription="A Dummy Resources Activity Event", + ) new_resources_activity_event.save() self.first_resources_activity_event = new_resources_activity_event # add a lookup reference type to the db - new_reference_type = LookupReferenceType.objects.create(documenttype="A Dummy Reference Type") + new_reference_type = LookupReferenceType.objects.create( + documenttype="A Dummy Reference Type" + ) new_reference_type.save() self.first_reference_type = new_reference_type # add a new citation to the db - new_citation = Citations.objects.create(referencetype=new_reference_type, authorprimary="Doe, John", year=2020, title="A Dummy Citation") + new_citation = Citations.objects.create( + referencetype=new_reference_type, + authorprimary="Doe, John", + year=2020, + title="A Dummy Citation", + ) new_citation.save() self.first_citation = new_citation @@ -199,20 +247,21 @@ def setUp(self): new_media = Media.objects.create(mediadescription="A Dummy Media") new_media.save() self.first_media = new_media + def test_get_related_wrong_permissions(self): from TEKDB.views import get_related - related_request = create_get_related_request(self, 'resources', 1) + related_request = create_get_related_request(self, "resources", 1) related_request.user = AnonymousUser() - response = get_related(related_request, 'resources', 1) + response = get_related(related_request, "resources", 1) self.assertEqual(response.status_code, 401) - + def test_get_related_records(self): from TEKDB.views import get_related - - related_request = create_get_related_request(self, 'record', 1) - related_request.user = Users.objects.get(username='admin') - response = get_related(related_request, 'record', 1) + + related_request = create_get_related_request(self, "record", 1) + related_request.user = Users.objects.get(username="admin") + response = get_related(related_request, "record", 1) self.assertEqual(response.status_code, 200) data = json.loads(response.content) self.assertTrue(isinstance(data, list)) @@ -221,10 +270,12 @@ def test_get_related_records(self): def test_get_related_places(self): from TEKDB.views import get_related - - related_request = create_get_related_request(self, 'places', self.first_place.placeid) - related_request.user = Users.objects.get(username='admin') - response = get_related(related_request, 'places', self.first_place.placeid) + + related_request = create_get_related_request( + self, "places", self.first_place.placeid + ) + related_request.user = Users.objects.get(username="admin") + response = get_related(related_request, "places", self.first_place.placeid) self.assertEqual(response.status_code, 200) data = json.loads(response.content) self.assertTrue(isinstance(data, list)) @@ -235,13 +286,17 @@ def test_get_related_places(self): # * Media Relationships # * Citation Relationships self.assertTrue(len(data) == 4) - + def test_get_related_resources(self): from TEKDB.views import get_related - - related_request = create_get_related_request(self, 'resources', self.first_resource.resourceid) - related_request.user = Users.objects.get(username='admin') - response = get_related(related_request, 'resources', self.first_resource.resourceid) + + related_request = create_get_related_request( + self, "resources", self.first_resource.resourceid + ) + related_request.user = Users.objects.get(username="admin") + response = get_related( + related_request, "resources", self.first_resource.resourceid + ) self.assertEqual(response.status_code, 200) data = json.loads(response.content) self.assertTrue(isinstance(data, list)) @@ -253,13 +308,21 @@ def test_get_related_resources(self): # * Resource Relationships # * Alternate Names self.assertTrue(len(data) == 5) - + def test_get_related_resource_activity_events(self): from TEKDB.views import get_related - - related_request = create_get_related_request(self, 'resourcesactivityevents', self.first_resources_activity_event.resourceactivityid) - related_request.user = Users.objects.get(username='admin') - response = get_related(related_request, 'resourcesactivityevents', self.first_resources_activity_event.resourceactivityid) + + related_request = create_get_related_request( + self, + "resourcesactivityevents", + self.first_resources_activity_event.resourceactivityid, + ) + related_request.user = Users.objects.get(username="admin") + response = get_related( + related_request, + "resourcesactivityevents", + self.first_resources_activity_event.resourceactivityid, + ) self.assertEqual(response.status_code, 200) data = json.loads(response.content) self.assertTrue(isinstance(data, list)) @@ -268,13 +331,17 @@ def test_get_related_resource_activity_events(self): # * Citation Relationships # * Media Relationships self.assertTrue(len(data) == 2) - + def test_get_related_citations(self): from TEKDB.views import get_related - - related_request = create_get_related_request(self, 'citations', self.first_citation.citationid) - related_request.user = Users.objects.get(username='admin') - response = get_related(related_request, 'citations', self.first_citation.citationid) + + related_request = create_get_related_request( + self, "citations", self.first_citation.citationid + ) + related_request.user = Users.objects.get(username="admin") + response = get_related( + related_request, "citations", self.first_citation.citationid + ) self.assertEqual(response.status_code, 200) data = json.loads(response.content) self.assertTrue(isinstance(data, list)) @@ -289,10 +356,12 @@ def test_get_related_citations(self): def test_get_related_media(self): from TEKDB.views import get_related - - related_request = create_get_related_request(self, 'media', self.first_media.mediaid) - related_request.user = Users.objects.get(username='admin') - response = get_related(related_request, 'media', self.first_media.mediaid) + + related_request = create_get_related_request( + self, "media", self.first_media.mediaid + ) + related_request.user = Users.objects.get(username="admin") + response = get_related(related_request, "media", self.first_media.mediaid) self.assertEqual(response.status_code, 200) data = json.loads(response.content) self.assertTrue(isinstance(data, list)) @@ -304,11 +373,15 @@ def test_get_related_media(self): # * Place-Resource Relationships # * Activity Relationships self.assertTrue(len(data) == 5) + + class ExportTest(TestCase): # fixtures = ['TEKDB/fixtures/all_dummy_data.json',] def setUp(self): - import_fixture_file(join(settings.BASE_DIR, 'TEKDB', 'fixtures', 'all_dummy_data.json')) + import_fixture_file( + join(settings.BASE_DIR, "TEKDB", "fixtures", "all_dummy_data.json") + ) self.factory = RequestFactory() self.credentials = b64encode(b"admin:admin").decode("ascii") @@ -326,16 +399,16 @@ def test_export(self): anon_response = ExportDatabase(export_request) self.assertEqual(anon_response.status_code, 302) - export_request.user = Users.objects.get(username='readonly') + export_request.user = Users.objects.get(username="readonly") bad_response = ExportDatabase(export_request) self.assertEqual(bad_response.status_code, 302) - export_request.user = Users.objects.get(username='admin') + export_request.user = Users.objects.get(username="admin") response = ExportDatabase(export_request, test=True) self.assertEqual(response.status_code, 200) with tempfile.TemporaryDirectory() as tempdir: - datestamp = datetime.now().strftime('%Y%m%d') + datestamp = datetime.now().strftime("%Y%m%d") zipname = get_export_file_from_response(response, tempdir, datestamp) # test for dump files @@ -354,12 +427,14 @@ def test_export(self): zip.close() for mediafile in listdir(settings.MEDIA_ROOT): source_file_location = join(settings.MEDIA_ROOT, mediafile) - source_file_relative_name = join('media', mediafile) + source_file_relative_name = join("media", mediafile) temp_file_location = join(tempdir, source_file_relative_name) # if a directory exists in media, then the folder name won't be the whole match if not isdir(source_file_relative_name): self.assertTrue(source_file_relative_name in zip.namelist()) - self.assertTrue(isfile(temp_file_location) or isdir(temp_file_location)) + self.assertTrue( + isfile(temp_file_location) or isdir(temp_file_location) + ) source_checksum = get_checksum(source_file_location, "md5") temp_checksum = get_checksum(temp_file_location, "md5") self.assertEqual(source_checksum, temp_checksum) @@ -376,12 +451,15 @@ def test_export(self): break self.assertTrue(new_record_found) + class ImportTest(TransactionTestCase): # fixtures = ['TEKDB/fixtures/all_dummy_data.json',] @classmethod def setUp(cls): - import_fixture_file(join(settings.BASE_DIR, 'TEKDB', 'fixtures', 'all_dummy_data.json')) + import_fixture_file( + join(settings.BASE_DIR, "TEKDB", "fixtures", "all_dummy_data.json") + ) cls.factory = RequestFactory() @@ -393,45 +471,47 @@ def setUp(cls): new_record.save() # Resources.moderated_object.fget(new_record).approve() - cls.zipname = join(settings.BASE_DIR, 'TEKDB', 'tests', 'test_files', 'exported_db.zip') + cls.zipname = join( + settings.BASE_DIR, "TEKDB", "tests", "test_files", "exported_db.zip" + ) cls.tempmediadir = tempfile.TemporaryDirectory() cls.import_request = cls.factory.post( - reverse('import_database'), + reverse("import_database"), { - 'MEDIA_DIR': cls.tempmediadir.name, - 'content_type':'application/zip', - 'content_disposition':"attachment; filename=uploaded.dump" - }, - headers = { - "Authorization": f"Basic {cls.credentials}" + "MEDIA_DIR": cls.tempmediadir.name, + "content_type": "application/zip", + "content_disposition": "attachment; filename=uploaded.dump", }, + headers={"Authorization": f"Basic {cls.credentials}"}, ) - with open(cls.zipname, 'rb') as z: + with open(cls.zipname, "rb") as z: import_file = InMemoryUploadedFile( z, - 'import_file', - 'exported_db.zip', - 'application/zip', + "import_file", + "exported_db.zip", + "application/zip", getsize(cls.zipname), - None + None, ) - cls.import_request.FILES['import_file'] = import_file - - cls.import_request.user = Users.objects.get(username='admin') - response = ImportDatabase(cls.import_request) + cls.import_request.FILES["import_file"] = import_file + cls.import_request.user = Users.objects.get(username="admin") + response = ImportDatabase(cls.import_request) # noqa: F841 def test_import(self): self.assertEqual(Resources.objects.all().count(), self.old_resources_count) - self.assertEqual(Resources.objects.filter(commonname=self.dummy_1_name).count(), 0) + self.assertEqual( + Resources.objects.filter(commonname=self.dummy_1_name).count(), 0 + ) # Test for media files in the temp dir zip = zipfile.ZipFile(self.zipname, "r") for filename in zip.namelist(): - if 'media' in filename and filename.index('media') == 0: + if "media" in filename and filename.index("media") == 0: # NOTE: zipfiles always use "/" as a separator. media_name = sep.join(filename.split("/")[1:]) self.assertTrue(media_name in listdir(self.tempmediadir.name)) shutil.rmtree(self.tempmediadir.name) + ### 2025-05-09: No one has any idea what a 'placeMap' is. # class PlaceMapTest(TestCase): # # fixtures = ['TEKDB/fixtures/all_dummy_data.json',] diff --git a/TEKDB/TEKDB/urls.py b/TEKDB/TEKDB/urls.py index 18eb1881..d28612d1 100644 --- a/TEKDB/TEKDB/urls.py +++ b/TEKDB/TEKDB/urls.py @@ -13,13 +13,13 @@ 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ -#from django.conf.urls import url -#from django.contrib import admin +# from django.conf.urls import url +# from django.contrib import admin -#urlpatterns = [ +# urlpatterns = [ # url(r'^admin/', admin.site.urls), -# url (r'^$', views.index, name='index'), -#] +# url (r'^$', views.index, name='index'), +# ] from django.conf.urls.static import static from django.conf import settings @@ -28,32 +28,54 @@ from django.contrib import admin from django.contrib.auth import views as auth_views from login import views as login_views -from dal import autocomplete from . import views -from . import models urlpatterns = [ # url(r'^login/', include('login.urls')), - path('login/', login_views.login, name='login'), - path('login_async/', login_views.login_async, name='login_async'), - path('logout/', auth_views.LogoutView.as_view(next_page='/'), name='logout'), - path('tinymce/', include('tinymce.urls')), - path('accounts/', include('django_registration.backends.one_step.urls')), - re_path(r'^admin/', admin.site.urls), - path('nested_admin/', include('nested_admin.urls')), - re_path(r'^tekdb/(?P\w+)/(?P\w+)/get_related$', views.get_related), - path('citation_autocomplete/', views.CitationAutocompleteView.as_view(), name='select2_fk_citation',), - path('export_database/', views.ExportDatabase, name='export_database'), - path('import_database/', views.ImportDatabase, name='import_database'), - path('medium_autocomplete/', views.MediaAutocompleteView.as_view(), name='select2_fk_media',), - path('place_autocomplete/', views.PlaceAutocompleteView.as_view(), name='select2_fk_place',), - path('place_resource_autocomplete/', views.PlaceResourceAutocompleteView.as_view(), name='select2_fk_placeresource',), - path('resource_autocomplete/', views.ResourceAutocompleteView.as_view(), name='select2_fk_resource',), - path('resource_activity_autocomplete/', views.ResourceActivityAutocompleteView.as_view(), name='select2_fk_resourceactivity',), - path('', include('explore.urls')), + path("login/", login_views.login, name="login"), + path("login_async/", login_views.login_async, name="login_async"), + path("logout/", auth_views.LogoutView.as_view(next_page="/"), name="logout"), + path("tinymce/", include("tinymce.urls")), + path("accounts/", include("django_registration.backends.one_step.urls")), + re_path(r"^admin/", admin.site.urls), + path("nested_admin/", include("nested_admin.urls")), + re_path(r"^tekdb/(?P\w+)/(?P\w+)/get_related$", views.get_related), + path( + "citation_autocomplete/", + views.CitationAutocompleteView.as_view(), + name="select2_fk_citation", + ), + path("export_database/", views.ExportDatabase, name="export_database"), + path("import_database/", views.ImportDatabase, name="import_database"), + path( + "medium_autocomplete/", + views.MediaAutocompleteView.as_view(), + name="select2_fk_media", + ), + path( + "place_autocomplete/", + views.PlaceAutocompleteView.as_view(), + name="select2_fk_place", + ), + path( + "place_resource_autocomplete/", + views.PlaceResourceAutocompleteView.as_view(), + name="select2_fk_placeresource", + ), + path( + "resource_autocomplete/", + views.ResourceAutocompleteView.as_view(), + name="select2_fk_resource", + ), + path( + "resource_activity_autocomplete/", + views.ResourceActivityAutocompleteView.as_view(), + name="select2_fk_resourceactivity", + ), + path("", include("explore.urls")), ] urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) -#if settings.DEBUG: +# if settings.DEBUG: # urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) diff --git a/TEKDB/TEKDB/views.py b/TEKDB/TEKDB/views.py index 260251d7..b711d571 100644 --- a/TEKDB/TEKDB/views.py +++ b/TEKDB/TEKDB/views.py @@ -4,34 +4,44 @@ from django.conf import settings from django.contrib.auth.decorators import user_passes_test, permission_required from django.core import management -from django.core.management.commands import loaddata, dumpdata from django.db import connection from django.db.models import Q -from django.db.utils import OperationalError -from django.http import HttpResponse, Http404, FileResponse, JsonResponse -from django.shortcuts import render, redirect +from django.http import HttpResponse, FileResponse, JsonResponse import io import os import shutil -from TEKDB.models import * +from TEKDB.models import ( + Citations, + Media, + Places, + PlacesResourceEvents, + Resources, + ResourcesActivityEvents, +) import tempfile import zipfile from configuration.models import Configuration + def get_related(request, model_name, id): from django.apps import apps import json - if not (request.user.is_authenticated and request.user.has_perm('TEKDB.change_%s' % model_name.lower())): - return HttpResponse('Unauthorized', status=401) + + if not ( + request.user.is_authenticated + and request.user.has_perm("TEKDB.change_%s" % model_name.lower()) + ): + return HttpResponse("Unauthorized", status=401) data = json.dumps([]) try: - model = apps.get_model('TEKDB', model_name) + model = apps.get_model("TEKDB", model_name) instance = model.objects.get(pk=id) - if hasattr(instance, 'get_related_objects'): + if hasattr(instance, "get_related_objects"): data = json.dumps(instance.get_related_objects(id)) - except: + except Exception: pass - return HttpResponse(data, content_type='application/json') + return HttpResponse(data, content_type="application/json") + # from https://www.geeksforgeeks.org/working-zip-files-python/ def get_all_file_paths(directory, cwd=False): @@ -50,13 +60,15 @@ def get_all_file_paths(directory, cwd=False): # returning all file paths return file_paths + # Only Admins! @user_passes_test(lambda u: u.is_superuser) def ExportDatabase(request, test=False): - from django.conf import settings - datestamp = datetime.now().strftime('%Y%m%d') - tmp_zip = tempfile.NamedTemporaryFile(delete=False, prefix="{}_backup_".format(datestamp), suffix='.zip') - os.chdir(os.path.join(settings.MEDIA_ROOT, '..')) + datestamp = datetime.now().strftime("%Y%m%d") + tmp_zip = tempfile.NamedTemporaryFile( + delete=False, prefix="{}_backup_".format(datestamp), suffix=".zip" + ) + os.chdir(os.path.join(settings.MEDIA_ROOT, "..")) relative_media_directory = settings.MEDIA_ROOT.split(os.path.sep)[-1] media_paths = get_all_file_paths(relative_media_directory, cwd=os.getcwd()) try: @@ -64,17 +76,17 @@ def ExportDatabase(request, test=False): # create filename dumpfile = "{}_backup.json".format(datestamp) dumpfile_location = os.path.join(tmp_dir, dumpfile) - with open(dumpfile_location, 'w') as of: - management.call_command('dumpdata', '--indent=2', stdout=of) + with open(dumpfile_location, "w") as of: + management.call_command("dumpdata", "--indent=2", stdout=of) # zip up: # * Data Dump file # * Media files - with zipfile.ZipFile(tmp_zip.name, 'w') as zip: + with zipfile.ZipFile(tmp_zip.name, "w") as zip: zip.write(dumpfile_location, dumpfile) for media_file in media_paths: zip.write(media_file) - response = FileResponse(open(tmp_zip.name, 'rb')) + response = FileResponse(open(tmp_zip.name, "rb")) return response finally: try: @@ -85,66 +97,79 @@ def ExportDatabase(request, test=False): return HttpResponse() + def getDBTruncateCommand(): f = io.StringIO() with contextlib.redirect_stdout(f): - management.call_command('sqlflush') + management.call_command("sqlflush") full_output = f.getvalue() - cmd_list = full_output.split('\n') - return [x for x in cmd_list if not x == ''] + cmd_list = full_output.split("\n") + return [x for x in cmd_list if not x == ""] # Only Admins! @user_passes_test(lambda u: u.is_superuser) def ImportDatabase(request): - from django.conf import settings status_code = 500 - status_message = 'An unknown error occurred.' - if not request.method == 'POST': + status_message = "An unknown error occurred." + if not request.method == "POST": status_code = 405 - status_message = 'Request method not allowed. Must be a post.' + status_message = "Request method not allowed. Must be a post." else: - if 'MEDIA_DIR' in request.POST.keys() and os.path.exists(request.POST['MEDIA_DIR']): + if "MEDIA_DIR" in request.POST.keys() and os.path.exists( + request.POST["MEDIA_DIR"] + ): # used for testing so current media is not overwritten - media_dir = request.POST['MEDIA_DIR'] + media_dir = request.POST["MEDIA_DIR"] else: media_dir = settings.MEDIA_ROOT # Unzip file - if 'import_file' in request.FILES.keys(): + if "import_file" in request.FILES.keys(): with tempfile.TemporaryDirectory() as tempdir: try: - tmp_zip_file = tempfile.NamedTemporaryFile(mode='wb+',delete=True, suffix='.zip') - for chunk in request.FILES['import_file'].chunks(): + tmp_zip_file = tempfile.NamedTemporaryFile( + mode="wb+", delete=True, suffix=".zip" + ) + for chunk in request.FILES["import_file"].chunks(): tmp_zip_file.write(chunk) tmp_zip_file.seek(0) except Exception as e: status_code = 500 - status_message = 'Unable to read the provided file. Be sure it is a zipped file containing a .json representing the database and a "media" directory containing any static files. {}'.format(e) - return JsonResponse({ - 'status_code': status_code, - 'status_message': status_message - }) + status_message = 'Unable to read the provided file. Be sure it is a zipped file containing a .json representing the database and a "media" directory containing any static files. {}'.format( + e + ) + return JsonResponse( + {"status_code": status_code, "status_message": status_message} + ) if zipfile.is_zipfile(tmp_zip_file): zip = zipfile.ZipFile(tmp_zip_file, "r") - non_media = [x for x in zip.namelist() if 'media' not in x and '.json' in x] + non_media = [ + x for x in zip.namelist() if "media" not in x and ".json" in x + ] # Validate Zip Contents if not len(non_media) == 1 or len(zip.namelist()) < 2: status_code = 500 status_message = "Received malformed import file. Must be a zipfile contailing one JSON file and a directory named 'media'" - return JsonResponse({ - 'status_code': status_code, - 'status_message': status_message - }) + return JsonResponse( + { + "status_code": status_code, + "status_message": status_message, + } + ) fixture_name = non_media[0] try: zip.extractall(tempdir) except Exception as e: status_code = 500 - status_message = 'Unable to unzip the provided file. Be sure it is a zipped file containing a .json representing the database and a "media" directory containing any static files. {}'.format(e) - return JsonResponse({ - 'status_code': status_code, - 'status_message': status_message - }) + status_message = 'Unable to unzip the provided file. Be sure it is a zipped file containing a .json representing the database and a "media" directory containing any static files. {}'.format( + e + ) + return JsonResponse( + { + "status_code": status_code, + "status_message": status_message, + } + ) try: # Emptying DB tables truncate_tables_cmds = getDBTruncateCommand() @@ -153,60 +178,79 @@ def ImportDatabase(request): cursor.execute(sql_command) except Exception as e: status_code = 500 - status_message = 'Error while attempting to remove old database data. New data has NOT been imported. Significant data loss possible. Please check your import file and try again. {}'.format(e) - return JsonResponse({ - 'status_code': status_code, - 'status_message': status_message - }) + status_message = "Error while attempting to remove old database data. New data has NOT been imported. Significant data loss possible. Please check your import file and try again. {}".format( + e + ) + return JsonResponse( + { + "status_code": status_code, + "status_message": status_message, + } + ) try: # Loading in DB Fixture fixture_file_path = os.path.join(tempdir, fixture_name) with open(fixture_file_path) as source_fixture: source_encoding = source_fixture.encoding - if not source_encoding.lower() == 'utf-8': - with open(fixture_file_path, 'rb') as source_fixture: - with open(os.path.join(tempdir, 'UTF8_fixture.json'), 'w+b') as target_fixture: + if not source_encoding.lower() == "utf-8": + with open(fixture_file_path, "rb") as source_fixture: + with open( + os.path.join(tempdir, "UTF8_fixture.json"), "w+b" + ) as target_fixture: contents = source_fixture.read() - target_fixture.write(contents.decode(source_encoding).encode('utf-8')) - reencoded = True + target_fixture.write( + contents.decode(source_encoding).encode("utf-8") + ) fixture_file_path = target_fixture.name - management.call_command('loaddata', fixture_file_path) + management.call_command("loaddata", fixture_file_path) except Exception as e: status_code = 500 - status_message = 'Error while loading in data from provided zipfile. Your old data has been removed. Please coordinate with IT to restore your database, and share this error message with them:\n {}'.format(e) - return JsonResponse({ - 'status_code': status_code, - 'status_message': status_message - }) + status_message = "Error while loading in data from provided zipfile. Your old data has been removed. Please coordinate with IT to restore your database, and share this error message with them:\n {}".format( + e + ) + return JsonResponse( + { + "status_code": status_code, + "status_message": status_message, + } + ) try: # Copy media into MEDIA dir - shutil.copytree(os.path.join(tempdir, 'media'), media_dir, dirs_exist_ok=True) + shutil.copytree( + os.path.join(tempdir, "media"), + media_dir, + dirs_exist_ok=True, + ) except Exception as e: status_code = 500 - status_message = 'Error while restoring your media files. Please work with IT to restore these, providing them your zipfile and this error message:\n {}'.format(e) - return JsonResponse({ - 'status_code': status_code, - 'status_message': status_message - }) + status_message = "Error while restoring your media files. Please work with IT to restore these, providing them your zipfile and this error message:\n {}".format( + e + ) + return JsonResponse( + { + "status_code": status_code, + "status_message": status_message, + } + ) status_code = 200 - status_message = 'Database import completed successfully.' + status_message = "Database import completed successfully." else: status_code = 400 - status_message = 'Uploaded file is not recognized as a zipfile. Be sure you have a valid backup file and try again.' + status_message = "Uploaded file is not recognized as a zipfile. Be sure you have a valid backup file and try again." else: status_code = 400 - status_message = 'Request must have an attached zipfile to restore the database from' + status_message = ( + "Request must have an attached zipfile to restore the database from" + ) + + return JsonResponse({"status_code": status_code, "status_message": status_message}) - return JsonResponse({ - 'status_code': status_code, - 'status_message': status_message - }) # Only Authenticated Users! -@permission_required('TEKDB.change_list') +@permission_required("TEKDB.change_list") def getPlacesGeoJSON(request): from .models import Places import json @@ -215,17 +259,15 @@ def getPlacesGeoJSON(request): places = Places.objects.exclude(geometry__isnull=True) # GeoJSON to store all places - geojson = { - 'type': 'FeatureCollection', - 'features': [] - } + geojson = {"type": "FeatureCollection", "features": []} # Check for max results configuration try: config = Configuration.objects.all()[0] max_results = config.max_results_returned - except Exception as e: + except Exception: from TEKDB.settings import DEFAULT_MAXIMUM_RESULTS + max_results = DEFAULT_MAXIMUM_RESULTS pass @@ -237,26 +279,31 @@ def getPlacesGeoJSON(request): for result in resultlist: result_geometry = json.loads(result.geometry.geojson) - result_indigenousplacename = result.indigenousplacename if result.indigenousplacename else '' - result_englishplacename = result.englishplacename if result.englishplacename else '' - result_placeid = result.placeid if result.placeid else '' + result_indigenousplacename = ( + result.indigenousplacename if result.indigenousplacename else "" + ) + result_englishplacename = ( + result.englishplacename if result.englishplacename else "" + ) + result_placeid = result.placeid if result.placeid else "" result_feature = { "type": "Feature", "geometry": result_geometry, "properties": { "indigenousplacename": result_indigenousplacename, "englishplacename": result_englishplacename, - "placeid": result_placeid - } + "placeid": result_placeid, + }, } - geojson['features'].append(result_feature) + geojson["features"].append(result_feature) return geojson - + class CitationAutocompleteView(autocomplete.Select2QuerySetView): def get_queryset(self): from django.db.models.functions import Lower + if not self.request.user.is_authenticated: return Citations.objects.none() qs = Citations.objects.all() @@ -264,27 +311,37 @@ def get_queryset(self): if self.q: qs = Citations.keyword_search(self.q) - return qs.order_by(Lower('referencetype__documenttype'), Lower('title'), Lower('intervieweeid__firstname'), Lower('intervieweeid__lastname'), 'year') + return qs.order_by( + Lower("referencetype__documenttype"), + Lower("title"), + Lower("intervieweeid__firstname"), + Lower("intervieweeid__lastname"), + "year", + ) + class MediaAutocompleteView(autocomplete.Select2QuerySetView): def get_queryset(self): from django.db.models.functions import Lower + if not self.request.user.is_authenticated: return Media.objects.none() qs = Media.objects.all() if self.q: qs = qs.filter( - Q(medianame__icontains=self.q) | - Q(mediatype__mediatype__icontains=self.q) | - Q(mediatype__mediacategory__icontains=self.q) + Q(medianame__icontains=self.q) + | Q(mediatype__mediatype__icontains=self.q) + | Q(mediatype__mediacategory__icontains=self.q) ) - return qs.order_by(Lower('medianame'), Lower('mediatype__mediatype')) + return qs.order_by(Lower("medianame"), Lower("mediatype__mediatype")) + class PlaceAutocompleteView(autocomplete.Select2QuerySetView): def get_queryset(self): from django.db.models.functions import Lower + if not self.request.user.is_authenticated: return Places.objects.none() qs = Places.objects.all() @@ -292,30 +349,34 @@ def get_queryset(self): if self.q: qs = Places.keyword_search(self.q) - return qs.order_by(Lower('indigenousplacename'), Lower('englishplacename')) + return qs.order_by(Lower("indigenousplacename"), Lower("englishplacename")) + class PlaceResourceAutocompleteView(autocomplete.Select2QuerySetView): def get_queryset(self): from django.db.models.functions import Lower + if not self.request.user.is_authenticated: return PlacesResourceEvents.objects.none() qs = PlacesResourceEvents.objects.all() if self.q: qs = qs.filter( - Q(placeid__indigenousplacename__icontains=self.q) | - Q(placeid__englishplacename__icontains=self.q) | - Q(resourceid__commonname__icontains=self.q) | - Q(resourceid__indigenousname__icontains=self.q) | - Q(resourceid__genus__icontains=self.q) | - Q(resourceid__species__icontains=self.q) + Q(placeid__indigenousplacename__icontains=self.q) + | Q(placeid__englishplacename__icontains=self.q) + | Q(resourceid__commonname__icontains=self.q) + | Q(resourceid__indigenousname__icontains=self.q) + | Q(resourceid__genus__icontains=self.q) + | Q(resourceid__species__icontains=self.q) ) - return qs.order_by(Lower('resourceid__commonname'), Lower('placeid__indigenousplacename')) + return qs.order_by( + Lower("resourceid__commonname"), Lower("placeid__indigenousplacename") + ) + class ResourceAutocompleteView(autocomplete.Select2QuerySetView): def get_queryset(self): - from django.db.models.functions import Lower if not self.request.user.is_authenticated: return Resources.objects.none() qs = Resources.objects.all() @@ -325,22 +386,28 @@ def get_queryset(self): return qs + class ResourceActivityAutocompleteView(autocomplete.Select2QuerySetView): def get_queryset(self): from django.db.models.functions import Lower + if not self.request.user.is_authenticated: return ResourcesActivityEvents.objects.none() qs = ResourcesActivityEvents.objects.all() if self.q: qs = qs.filter( - Q(placeresourceid__placeid__indigenousplacename__icontains=self.q) | - Q(placeresourceid__placeid__englishplacename__icontains=self.q) | - Q(placeresourceid__resourceid__commonname__icontains=self.q) | - Q(placeresourceid__resourceid__indigenousname__icontains=self.q) | - Q(placeresourceid__resourceid__genus__icontains=self.q) | - Q(placeresourceid__resourceid__species__icontains=self.q) | - Q(activityshortdescription__activity__icontains=self.q) + Q(placeresourceid__placeid__indigenousplacename__icontains=self.q) + | Q(placeresourceid__placeid__englishplacename__icontains=self.q) + | Q(placeresourceid__resourceid__commonname__icontains=self.q) + | Q(placeresourceid__resourceid__indigenousname__icontains=self.q) + | Q(placeresourceid__resourceid__genus__icontains=self.q) + | Q(placeresourceid__resourceid__species__icontains=self.q) + | Q(activityshortdescription__activity__icontains=self.q) ) - return qs.order_by(Lower('activityshortdescription__activity'), Lower('placeresourceid__placeid__indigenousplacename'), Lower('placeresourceid__resourceid__commonname')) + return qs.order_by( + Lower("activityshortdescription__activity"), + Lower("placeresourceid__placeid__indigenousplacename"), + Lower("placeresourceid__resourceid__commonname"), + ) diff --git a/TEKDB/TEKDB/widgets.py b/TEKDB/TEKDB/widgets.py index dd715ec3..200fb1f0 100644 --- a/TEKDB/TEKDB/widgets.py +++ b/TEKDB/TEKDB/widgets.py @@ -1,36 +1,33 @@ import logging -from django.conf import settings -from django.contrib.gis import gdal from django.contrib.gis.geometry import json_regex -from django.contrib.gis.geos import GEOSException, GEOSGeometry -from django.forms.widgets import Widget -from django.utils import translation +from django.contrib.gis.forms.widgets import BaseGeometryWidget +from django.forms.widgets import ClearableFileInput +from django.utils.safestring import mark_safe -logger = logging.getLogger('django.contrib.gis') +logger = logging.getLogger("django.contrib.gis") -from django.contrib.gis.forms.widgets import OpenLayersWidget, BaseGeometryWidget # class OpenLayersWidget(BaseGeometryWidget): # class OpenLayers6Widget(OpenLayersWidget): class OpenLayers6Widget(BaseGeometryWidget): - template_name = 'gis/openlayers_widget_itkdb.html' + template_name = "gis/openlayers_widget_itkdb.html" map_srid = 3857 class Media: css = { - 'all': ( - 'assets/openlayers6/ol.css', - 'gis/css/ol3.css', + "all": ( + "assets/openlayers6/ol.css", + "gis/css/ol3.css", ) } js = ( - 'assets/openlayers6/ol.js', - 'gis/js/OL6MapWidget.js', + "assets/openlayers6/ol.js", + "gis/js/OL6MapWidget.js", ) def serialize(self, value): - return value.json if value else '' + return value.json if value else "" def deserialize(self, value): geom = super().deserialize(value) @@ -41,43 +38,46 @@ def deserialize(self, value): def get_context(self, name, value, attrs): from TEKDB.context_processors import add_map_default_context - request_context = add_map_default_context({}) # passing empty dict to represent unneccesary request value + + request_context = add_map_default_context( + {} + ) # passing empty dict to represent unneccesary request value widget_context = super().get_context(name, value, attrs) widget_context.update(request_context) return widget_context + class OpenLayers6PolygonWidget(OpenLayers6Widget): class Media: css = { - 'all': ( - 'assets/openlayers6/ol.css', - 'gis/css/ol3.css', - 'gis/css/OpenLayers6PolygonWidget.css', + "all": ( + "assets/openlayers6/ol.css", + "gis/css/ol3.css", + "gis/css/OpenLayers6PolygonWidget.css", ) } js = ( - 'assets/openlayers6/ol.js', - 'gis/js/OL6MapPolygonWidget.js', + "assets/openlayers6/ol.js", + "gis/js/OL6MapPolygonWidget.js", ) -from django.forms.widgets import ClearableFileInput -from django.utils.safestring import mark_safe - class ThumbnailFileInput(ClearableFileInput): - template_name = 'widgets/thumbnail_file_input.html' + template_name = "widgets/thumbnail_file_input.html" allow_multiple_selected = True # Enable multiple file uploads def format_value(self, value): - if value and hasattr(value, 'url'): + if value and hasattr(value, "url"): return mark_safe(f'') return super().format_value(value) def __init__(self, attrs=None): if attrs is None: attrs = {} - attrs.update({ - 'multiple': 'multiple' # Allow multiple file selection - }) - super().__init__(attrs) \ No newline at end of file + attrs.update( + { + "multiple": "multiple" # Allow multiple file selection + } + ) + super().__init__(attrs) diff --git a/TEKDB/configuration/admin.py b/TEKDB/configuration/admin.py index 40ddf215..6b876787 100644 --- a/TEKDB/configuration/admin.py +++ b/TEKDB/configuration/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin from django.forms import ModelForm -from TEKDB.widgets import OpenLayers6Widget, OpenLayers6PolygonWidget +from TEKDB.widgets import OpenLayers6PolygonWidget from reversion.admin import VersionAdmin from configuration.models import Configuration @@ -11,48 +11,63 @@ class Meta: model = Configuration widgets = { # 'geometry': OpenLayers6Widget(), - 'geometry': OpenLayers6PolygonWidget(), + "geometry": OpenLayers6PolygonWidget(), } - fields = '__all__' + fields = "__all__" + @admin.register(Configuration) class ConfigurationAdmin(VersionAdmin): - list_display = ('preferred_initialism_or_pk','max_results_returned') + list_display = ("preferred_initialism_or_pk", "max_results_returned") fieldsets = ( - ('Site Header', { - 'fields':( - 'preferredInitialism', - ('logo', 'logo_override'), - 'preferredInitialismPlacement', - ) - }), - ('Home Page', { - 'fields': ( - ('homepage_font_color','homepage_left_background','homepage_right_background'), - ('homepage_image','homepage_image_attribution',) - ) - }), - ('Search Results', { - 'fields': ( - 'max_results_returned', - 'min_search_rank', - 'min_search_similarity', - ) - }), - ('Map Defaults', { - 'fields': ( - 'geometry', - ) - }), + ( + "Site Header", + { + "fields": ( + "preferredInitialism", + ("logo", "logo_override"), + "preferredInitialismPlacement", + ) + }, + ), + ( + "Home Page", + { + "fields": ( + ( + "homepage_font_color", + "homepage_left_background", + "homepage_right_background", + ), + ( + "homepage_image", + "homepage_image_attribution", + ), + ) + }, + ), + ( + "Search Results", + { + "fields": ( + "max_results_returned", + "min_search_rank", + "min_search_similarity", + ) + }, + ), + ("Map Defaults", {"fields": ("geometry",)}), ) form = ConfigurationForm - + # Limit to only ONE configuration record, as laid out here: https://stackoverflow.com/a/25088487/706797 by radtek def has_add_permission(self, request): - return False if self.model.objects.count() > 0 else super().has_add_permission(request) + return ( + False + if self.model.objects.count() > 0 + else super().has_add_permission(request) + ) def preferred_initialism_or_pk(self, obj): return obj.pk if not obj.preferredInitialism else obj.preferredInitialism - - diff --git a/TEKDB/configuration/apps.py b/TEKDB/configuration/apps.py index eab8aa0d..2205ffbd 100644 --- a/TEKDB/configuration/apps.py +++ b/TEKDB/configuration/apps.py @@ -2,5 +2,5 @@ class ConfigurationConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'configuration' + default_auto_field = "django.db.models.BigAutoField" + name = "configuration" diff --git a/TEKDB/configuration/models.py b/TEKDB/configuration/models.py index bb777243..e24868ca 100644 --- a/TEKDB/configuration/models.py +++ b/TEKDB/configuration/models.py @@ -1,113 +1,113 @@ from django.db import models from django.contrib.gis.db.models import GeometryField -from django.db.models.signals import post_save -from django.dispatch import receiver from tinymce.models import HTMLField from colorfield.fields import ColorField from django.conf import settings -from TEKDB.widgets import OpenLayers6Widget + # Create your models here. class Configuration(models.Model): - preferredInitialism = models.CharField( - max_length=15, - default='ITK', + max_length=15, + default="ITK", blank=True, verbose_name="Preferred sharthand for traditional knowledge", - help_text="Suggestions: 'ITK', 'TEK', etc..." + help_text="Suggestions: 'ITK', 'TEK', etc...", ) preferredInitialismPlacementChoices = [ - ('default', 'Align Center'), - ('before', 'Align Left'), - ('after', 'Align Right'), + ("default", "Align Center"), + ("before", "Align Left"), + ("after", "Align Right"), ] preferredInitialismPlacement = models.CharField( default=preferredInitialismPlacementChoices[0], choices=preferredInitialismPlacementChoices, max_length=255, - help_text="Select the position of the preferred initialism in relative to the logo." + help_text="Select the position of the preferred initialism in relative to the logo.", ) LOGO_CHOICES = [ - ('/static/explore/img/logos/logo_weave.svg', 'Weave'), - ('/static/explore/img/logos/logo_drop.svg', 'Droplet'), - ('Other', 'Custom'), + ("/static/explore/img/logos/logo_weave.svg", "Weave"), + ("/static/explore/img/logos/logo_drop.svg", "Droplet"), + ("Other", "Custom"), ] - logo_help_text = "Choose your logo for the site header. You can choose between:
    " + logo_help_text = ( + "Choose your logo for the site header. You can choose between:
      " + ) for logo_choice in LOGO_CHOICES[:-1]: - logo_help_text += "
    • '{}'
    • ".format(logo_choice[1], logo_choice[0]) + logo_help_text += '
    • \'{}\'
    • '.format( + logo_choice[1], logo_choice[0] + ) logo_help_text += "
    • Or choose 'Custom' and add your own using the Header Logo Override Image field.
    " - + logo = models.CharField( default=LOGO_CHOICES[0], choices=LOGO_CHOICES, max_length=255, - help_text=logo_help_text + help_text=logo_help_text, ) logo_override = models.ImageField( blank=True, null=True, default=None, - verbose_name='Header Logo Override Image', - help_text="Use this to add your own logo to the site header" + verbose_name="Header Logo Override Image", + help_text="Use this to add your own logo to the site header", ) objects = models.Manager() - # TODO: + # TODO: # * How to limit drawing options to polygon only? # * How to initialize drawing interaction to be 'polygon'? geometry = GeometryField( srid=3857, - null=True, blank=True, + null=True, + blank=True, verbose_name="Area of Interest", default=None, - help_text="Indicate the region in which most of your 'place' records are likely to exist. This serves to set the map conveniently for staff entering records. Records are allowed to exist outside of the area you indicate, and this can be changed at any time." + help_text="Indicate the region in which most of your 'place' records are likely to exist. This serves to set the map conveniently for staff entering records. Records are allowed to exist outside of the area you indicate, and this can be changed at any time.", ) homepage_image = models.ImageField( - blank=True, - default=None, + blank=True, + default=None, verbose_name="Homepage Image", - help_text="If you have a preferred image for the landing page, put it here. If blank, users will see a default image." + help_text="If you have a preferred image for the landing page, put it here. If blank, users will see a default image.", ) homepage_image_attribution = HTMLField( blank=True, null=True, default=None, - verbose_name='Homepage Image attribution', - help_text="If using a custom image that requires attribution for use, please provide that here." - ) #TinyMCE HTML Field + verbose_name="Homepage Image attribution", + help_text="If using a custom image that requires attribution for use, please provide that here.", + ) # TinyMCE HTML Field COLOR_PALETTE = [] for key in settings.PROJ_CSS.keys(): - COLOR_PALETTE.append( - (settings.PROJ_CSS[key], key) - ) + COLOR_PALETTE.append((settings.PROJ_CSS[key], key)) - COLOR_PALETTE.append(("#FFFFFF", 'white')) - COLOR_PALETTE.append(("#000000", 'black')) + COLOR_PALETTE.append(("#FFFFFF", "white")) + COLOR_PALETTE.append(("#000000", "black")) homepage_font_color = ColorField( - default='#FFFFFF', + default="#FFFFFF", help_text="Text color on homepage. Recommended: White (#FFFFFF).", verbose_name="Homepage Text Color", samples=COLOR_PALETTE, ) homepage_left_background = ColorField( - default='#000000', + default="#000000", help_text="Background color behind Text on homepage. Recommended: Black (#000000).", verbose_name="Left Homepage Background Color", samples=COLOR_PALETTE, ) homepage_right_background = ColorField( - default='#000000', + default="#000000", help_text="Background color behind image on homepage. Recommended: Black (#000000).", verbose_name="Right Homepage Background Color", samples=COLOR_PALETTE, @@ -115,51 +115,50 @@ class Configuration(models.Model): max_results_returned = models.IntegerField( default=500, - verbose_name='Maximum no. of search results', - help_text='500 is recommended. Allowing more may result in poor website performance or strain on the server.' + verbose_name="Maximum no. of search results", + help_text="500 is recommended. Allowing more may result in poor website performance or strain on the server.", ) # * Making search settings customizable by admin SEARCH_RANK_CHOICES = [ - (0.01, 'Lowest'), - (0.1, 'Default'), - (0.6, 'Moderate'), - (0.9, 'Highest'), + (0.01, "Lowest"), + (0.1, "Default"), + (0.6, "Moderate"), + (0.9, "Highest"), ] min_search_rank = models.FloatField( default=None, choices=SEARCH_RANK_CHOICES, max_length=255, - verbose_name='Minimum Search Rank', - help_text='The lowest acceptable ranking score assigned to search results.', + verbose_name="Minimum Search Rank", + help_text="The lowest acceptable ranking score assigned to search results.", null=True, blank=True, ) SEARCH_SIMILARITY_CHOICES = [ - (0.01, 'Permissive'), - (0.1, 'Default'), - (0.3, 'Similar'), - (0.4, 'Has Match'), - (0.9, 'Exact Match'), + (0.01, "Permissive"), + (0.1, "Default"), + (0.3, "Similar"), + (0.4, "Has Match"), + (0.9, "Exact Match"), ] min_search_similarity = models.FloatField( default=None, choices=SEARCH_SIMILARITY_CHOICES, max_length=255, - verbose_name='Minimum Search Similarity', - help_text='The lowest threshold for similar search results to be included in results.', + verbose_name="Minimum Search Similarity", + help_text="The lowest threshold for similar search results to be included in results.", null=True, blank=True, ) - # TODO: Allow users to: # * Override default theme colors (x8) - # Look into Django-Colorfield: https://stackoverflow.com/a/57080102/706797 + # Look into Django-Colorfield: https://stackoverflow.com/a/57080102/706797 # Offer a 'page preview' of the homepage. # place_icon': 'explore/img/icons/i_place.svg', @@ -179,8 +178,9 @@ class Configuration(models.Model): # media_name_override def __unicode__(self): - return unicode("Site Configuration: '{}' ({})".format(self.preferredInitialism, self.pk)) + return unicode( # noqa: F821 + "Site Configuration: '{}' ({})".format(self.preferredInitialism, self.pk) + ) def __str__(self): return "Site Configuration: '{}' ({})".format(self.preferredInitialism, self.pk) - diff --git a/TEKDB/configuration/tests.py b/TEKDB/configuration/tests.py index 7ce503c2..a39b155a 100644 --- a/TEKDB/configuration/tests.py +++ b/TEKDB/configuration/tests.py @@ -1,3 +1 @@ -from django.test import TestCase - # Create your tests here. diff --git a/TEKDB/explore/admin.py b/TEKDB/explore/admin.py index dc0fa4e1..0338a612 100644 --- a/TEKDB/explore/admin.py +++ b/TEKDB/explore/admin.py @@ -1,4 +1,4 @@ from django.contrib import admin -from .models import * +from .models import PageContent admin.site.register(PageContent) diff --git a/TEKDB/explore/apps.py b/TEKDB/explore/apps.py index c8f7ea1e..06f699cf 100644 --- a/TEKDB/explore/apps.py +++ b/TEKDB/explore/apps.py @@ -2,4 +2,4 @@ class ExploreConfig(AppConfig): - name = 'explore' + name = "explore" diff --git a/TEKDB/explore/context_processors.py b/TEKDB/explore/context_processors.py index 7745fd37..af175970 100644 --- a/TEKDB/explore/context_processors.py +++ b/TEKDB/explore/context_processors.py @@ -1,39 +1,40 @@ def explore_context(request): try: from django.conf import settings - except Exception as e: + except Exception: try: from TEKDB import settings except Exception as e: - print('Could not import settings from TEKDB') + print("Could not import settings from TEKDB") print(e) settings = False try: from configuration.models import Configuration + configs = Configuration.objects.all()[0] - except Exception as e: + except Exception: configs = False ###################################### # PROJ_LOGO_TEXT # ###################################### - project_logo_text = 'ITK' - project_text_placement = 'default' + project_logo_text = "ITK" + project_text_placement = "default" if settings: try: if len(settings.PROJ_LOGO_TEXT) > 0: project_logo_text = settings.PROJ_LOGO_TEXT - except Exception as e: + except Exception: pass - + if configs: try: project_logo_text = configs.preferredInitialism project_text_placement = configs.preferredInitialismPlacement - except Exception as e: + except Exception: pass ###################################### @@ -41,17 +42,17 @@ def explore_context(request): ###################################### proj_css = { - 'primary_a': '#8f371c', - 'primary_b': '#f7f3eb', - 'primary_c': '#0e1522', - 'primary_d': '#ced2da', - 'secondary_a': '#51723b', - 'secondary_b': '#839230', - 'secondary_c': '#6ea32e', - 'secondary_d': '#b44ba3', - 'font_face_primary': '/static/explore/fonts/Open_Sans/static/OpenSans-Regular-export/OpenSans-Regular.css', - 'font_face_primary_bold': '/static/explore/fonts/Open_Sans/static/OpenSans-Bold-export/OpenSans-Bold.css', - 'font_face_primary_extrabold': '/static/explore/fonts/Open_Sans/static/OpenSans-ExtraBold-export/OpenSans-ExtraBold.css', + "primary_a": "#8f371c", + "primary_b": "#f7f3eb", + "primary_c": "#0e1522", + "primary_d": "#ced2da", + "secondary_a": "#51723b", + "secondary_b": "#839230", + "secondary_c": "#6ea32e", + "secondary_d": "#b44ba3", + "font_face_primary": "/static/explore/fonts/Open_Sans/static/OpenSans-Regular-export/OpenSans-Regular.css", + "font_face_primary_bold": "/static/explore/fonts/Open_Sans/static/OpenSans-Bold-export/OpenSans-Bold.css", + "font_face_primary_extrabold": "/static/explore/fonts/Open_Sans/static/OpenSans-ExtraBold-export/OpenSans-ExtraBold.css", } if settings: @@ -59,7 +60,7 @@ def explore_context(request): try: if key in settings.PROJ_CSS.keys(): proj_css[key] = settings.PROJ_CSS[key] - except Exception as e: + except Exception: pass if configs: @@ -68,134 +69,155 @@ def explore_context(request): try: if hasattr(configs, key) and getattr(configs, key): proj_css[key] = getattr(configs, key) - except Exception as e: + except Exception: pass - ###################################### # PROJ_ICONS # ###################################### proj_icons = { - 'logo': '/static/explore/img/logos/logo_weave.svg', - 'place_icon': 'explore/img/icons/i_place.svg', - 'resource_icon': 'explore/img/icons/i_resource.svg', - 'activity_icon': 'explore/img/icons/i_activity.svg', - 'source_icon': 'explore/img/icons/i_source.svg', - 'media_icon': 'explore/img/icons/i_media.svg', + "logo": "/static/explore/img/logos/logo_weave.svg", + "place_icon": "explore/img/icons/i_place.svg", + "resource_icon": "explore/img/icons/i_resource.svg", + "activity_icon": "explore/img/icons/i_activity.svg", + "source_icon": "explore/img/icons/i_source.svg", + "media_icon": "explore/img/icons/i_media.svg", } - + if settings: for key in proj_icons.keys(): try: if key in settings.PROJ_ICONS.keys(): proj_icons[key] = settings.PROJ_ICONS[key] - except Exception as e: + except Exception: pass - + if configs: for key in proj_icons.keys(): try: if hasattr(configs, key) and getattr(configs, key): icon_value = getattr(configs, key) - if icon_value == 'Other': - if hasattr(configs, '{}_override'.format(key)) and getattr(configs, '{}_override'.format(key)): - abs_project_icon_override_filename = getattr(configs, '{}_override'.format(key)).file.name - rel_filename = abs_project_icon_override_filename.split(settings.MEDIA_ROOT)[-1] - icon_override_select = "{}{}".format(settings.MEDIA_URL, rel_filename) + if icon_value == "Other": + if hasattr(configs, "{}_override".format(key)) and getattr( + configs, "{}_override".format(key) + ): + abs_project_icon_override_filename = getattr( + configs, "{}_override".format(key) + ).file.name + rel_filename = abs_project_icon_override_filename.split( + settings.MEDIA_ROOT + )[-1] + icon_override_select = "{}{}".format( + settings.MEDIA_URL, rel_filename + ) proj_icons[key] = icon_override_select else: proj_icons[key] = getattr(configs, key) - except Exception as e: + except Exception: pass ###################################### # HOME IMAGE/Attribution # ###################################### - project_image_select = '/static/explore/img/homepage/5050508427_ec55eed5f4_o.jpg' + project_image_select = "/static/explore/img/homepage/5050508427_ec55eed5f4_o.jpg" home_image_attribution = 'Image courtesy of Monteregina and used under the CC BY-NC-SA 2.0 Licence. No changes were made.' if settings: try: if settings.PROJ_IMAGE_SELECT and len(settings.PROJ_IMAGE_SELECT) > 0: project_image_select = settings.PROJ_IMAGE_SELECT - except ImportError as e: + except ImportError: pass try: if settings.PROJ_IMAGE_ATTR and len(settings.PROJ_IMAGE_ATTR) > 0: home_image_attribution = settings.PROJ_IMAGE_ATTR - except ImportError as e: + except ImportError: pass if configs: try: - if hasattr(configs, 'homepage_image') and getattr(configs, 'homepage_image'): - abs_project_image_filename = getattr(configs, 'homepage_image').file.name + if hasattr(configs, "homepage_image") and getattr( + configs, "homepage_image" + ): + abs_project_image_filename = getattr( + configs, "homepage_image" + ).file.name rel_filename = abs_project_image_filename.split(settings.MEDIA_ROOT)[-1] project_image_select = "{}{}".format(settings.MEDIA_URL, rel_filename) home_image_attribution = False - except Exception as e: + except Exception: pass try: - if hasattr(configs, 'homepage_image_attribution') and getattr(configs, 'homepage_image_attribution'): - home_image_attribution = getattr(configs, 'homepage_image_attribution') - except Exception as e: + if hasattr(configs, "homepage_image_attribution") and getattr( + configs, "homepage_image_attribution" + ): + home_image_attribution = getattr(configs, "homepage_image_attribution") + except Exception: pass ###################################### # HOME_COLORS # ###################################### - home_font_color = '#FFFFFF' - homepage_left_background = '#000000' - homepage_right_background = '#000000' + home_font_color = "#FFFFFF" + homepage_left_background = "#000000" + homepage_right_background = "#000000" if settings: try: home_font_color = settings.HOME_FONT_COLOR - except Exception as e: + except Exception: pass try: homepage_left_background = settings.HOME_LEFT_BACKGROUND - except Exception as e: + except Exception: pass try: homepage_right_background = settings.HOME_RIGHT_BACKGROUND - except Exception as e: + except Exception: pass - + if configs: try: - if hasattr(configs, 'homepage_font_color') and getattr(configs, 'homepage_font_color'): - home_font_color = getattr(configs, 'homepage_font_color') - except Exception as e: + if hasattr(configs, "homepage_font_color") and getattr( + configs, "homepage_font_color" + ): + home_font_color = getattr(configs, "homepage_font_color") + except Exception: pass try: - if hasattr(configs, 'homepage_left_background') and getattr(configs, 'homepage_left_background'): - homepage_left_background = getattr(configs, 'homepage_left_background') - except Exception as e: + if hasattr(configs, "homepage_left_background") and getattr( + configs, "homepage_left_background" + ): + homepage_left_background = getattr(configs, "homepage_left_background") + except Exception: pass try: - if hasattr(configs, 'homepage_right_background') and getattr(configs, 'homepage_right_background'): - homepage_right_background = getattr(configs, 'homepage_right_background') - except Exception as e: + if hasattr(configs, "homepage_right_background") and getattr( + configs, "homepage_right_background" + ): + homepage_right_background = getattr( + configs, "homepage_right_background" + ) + except Exception: pass from TEKDB.settings import RECORD_ICONS return { - 'proj_logo_text': project_logo_text, - 'proj_text_placement': project_text_placement, - 'proj_css': proj_css, - 'proj_icons': proj_icons, - 'proj_image_select': project_image_select, - 'home_image_attribution': home_image_attribution, - 'home_font_color': home_font_color, - 'homepage_left_background': homepage_left_background, - 'homepage_right_background': homepage_right_background, - 'map_pin': RECORD_ICONS['map_pin'], - 'map_pin_selected': RECORD_ICONS['map_pin_selected'] - } \ No newline at end of file + "proj_logo_text": project_logo_text, + "proj_text_placement": project_text_placement, + "proj_css": proj_css, + "proj_icons": proj_icons, + "proj_image_select": project_image_select, + "home_image_attribution": home_image_attribution, + "home_font_color": home_font_color, + "homepage_left_background": homepage_left_background, + "homepage_right_background": homepage_right_background, + "map_pin": RECORD_ICONS["map_pin"], + "map_pin_selected": RECORD_ICONS["map_pin_selected"], + } diff --git a/TEKDB/explore/models.py b/TEKDB/explore/models.py index 9da112a7..00c358d2 100644 --- a/TEKDB/explore/models.py +++ b/TEKDB/explore/models.py @@ -2,22 +2,30 @@ from tinymce.models import HTMLField PAGE_CONTENT_CHOICES = ( - ('Welcome', 'Welcome'), - ('About', 'About'), - ('Help', 'Help'), + ("Welcome", "Welcome"), + ("About", "About"), + ("Help", "Help"), ) + class PageContent(models.Model): - page = models.CharField(max_length=255, choices=PAGE_CONTENT_CHOICES, primary_key=True) - content = HTMLField(blank=True, null=True) # use TinyMCE HTMLField - is_html = models.BooleanField(default=False, help_text='Select this if you want to use raw HTML instead. For this option, use the "HTML content" window below.') - html_content = models.TextField(blank=True, null=True, help_text='raw html if html == True') + page = models.CharField( + max_length=255, choices=PAGE_CONTENT_CHOICES, primary_key=True + ) + content = HTMLField(blank=True, null=True) # use TinyMCE HTMLField + is_html = models.BooleanField( + default=False, + help_text='Select this if you want to use raw HTML instead. For this option, use the "HTML content" window below.', + ) + html_content = models.TextField( + blank=True, null=True, help_text="raw html if html == True" + ) class Meta: - verbose_name_plural = 'Page Contents' + verbose_name_plural = "Page Contents" def __unicode__(self): - return unicode("%s" % (self.page)) + return unicode("%s" % (self.page)) # noqa: F821 def __str__(self): return self.page diff --git a/TEKDB/explore/templatetags/explore_tags.py b/TEKDB/explore/templatetags/explore_tags.py index 3b692bf1..985c3e15 100644 --- a/TEKDB/explore/templatetags/explore_tags.py +++ b/TEKDB/explore/templatetags/explore_tags.py @@ -2,15 +2,18 @@ register = template.Library() -@register.filter(name='mult') + +@register.filter(name="mult") def mult(value, arg): """Multiplies the value by the arg""" - return int(value)*int(arg) + return int(value) * int(arg) -@register.filter(name='subtract') -def mult(value, arg): + +# redefining 'mult' from line 6, should this be 'subtract'? +@register.filter(name="subtract") +def mult(value, arg): # noqa: F811 """Subtracts the arg from the value""" - return int(value)-int(arg) + return int(value) - int(arg) # register.filter('mult', mult) diff --git a/TEKDB/explore/tests/test_views.py b/TEKDB/explore/tests/test_views.py index 0ed4e237..1962e0b4 100644 --- a/TEKDB/explore/tests/test_views.py +++ b/TEKDB/explore/tests/test_views.py @@ -1,7 +1,6 @@ from base64 import b64encode from django.conf import settings -from django.db import connection from django.test import TestCase from django.test.client import RequestFactory from django.urls import reverse @@ -13,29 +12,30 @@ # coverage run manage.py test explore -v 2 ######################################################################### + class SearchTest(TestCase): # fixtures = ['TEKDB/fixtures/all_dummy_data.json',] def setUp(self): - import_fixture_file(join(settings.BASE_DIR, 'TEKDB', 'fixtures', 'all_dummy_data.json')) + import_fixture_file( + join(settings.BASE_DIR, "TEKDB", "fixtures", "all_dummy_data.json") + ) self.factory = RequestFactory() self.credentials = b64encode(b"admin:admin").decode("ascii") def test_multi_word_search(self): # Test that the query string submitted matches the query string returned to the client/user - from explore.views import search from TEKDB.models import Users + query_string = "A multi word search" request = self.factory.get( - reverse('search'), - headers = { - "Authorization": f"Basic {self.credentials}" - }, - data = { - 'query': query_string, - } + reverse("search"), + headers={"Authorization": f"Basic {self.credentials}"}, + data={ + "query": query_string, + }, ) - request.user = Users.objects.get(username='admin') + request.user = Users.objects.get(username="admin") # Assert that the search query string matches the query string submitted - self.assertEqual(query_string, request.GET['query']) + self.assertEqual(query_string, request.GET["query"]) diff --git a/TEKDB/explore/urls.py b/TEKDB/explore/urls.py index d7f5b283..d66626f3 100644 --- a/TEKDB/explore/urls.py +++ b/TEKDB/explore/urls.py @@ -3,25 +3,27 @@ from . import views explore_patterns = [ - path('', views.explore), - re_path(r'^(?P\w+)/$', views.get_by_model_type), - re_path(r'^(?P\w+)/(?P\w+)/$', views.get_by_model_id), - re_path(r'^(?P\w+)/(?P\w+)/download$', views.download_media_file), + path("", views.explore), + re_path(r"^(?P\w+)/$", views.get_by_model_type), + re_path(r"^(?P\w+)/(?P\w+)/$", views.get_by_model_id), + re_path(r"^(?P\w+)/(?P\w+)/download$", views.download_media_file), ] export_patterns = [ - path('', views.download), - re_path(r'^(?P\w+)/(?P\w+)/(?P\w+)/$', views.export_by_model_id), + path("", views.download), + re_path( + r"^(?P\w+)/(?P\w+)/(?P\w+)/$", views.export_by_model_id + ), ] urlpatterns = [ - re_path(r'^about/', views.about), - re_path(r'^help/', views.help), - re_path(r'^search/', views.search, name='search'), - path('explore', views.explore), - path('explore/', include(explore_patterns)), - path('export', views.download), - path('export/', include(export_patterns)), - path('', views.home), + re_path(r"^about/", views.about), + re_path(r"^help/", views.help), + re_path(r"^search/", views.search, name="search"), + path("explore", views.explore), + path("explore/", include(explore_patterns)), + path("export", views.download), + path("export/", include(export_patterns)), + path("", views.home), ] - #url(r'^logout$', views.logout, name='logout'), +# url(r'^logout$', views.logout, name='logout'), diff --git a/TEKDB/explore/views.py b/TEKDB/explore/views.py index a5251073..41c625ec 100644 --- a/TEKDB/explore/views.py +++ b/TEKDB/explore/views.py @@ -1,9 +1,10 @@ from django.contrib.auth.decorators import login_required from django.http import HttpResponse, Http404 from django.shortcuts import render -from .models import * +from .models import PageContent from configuration.models import Configuration + # Create your views here. def home(request): try: @@ -12,18 +13,19 @@ def home(request): page_content = page_content_obj.html_content else: page_content = page_content_obj.content - except Exception as e: + except Exception: page_content = "

    Welcome

    Set Welcome Page Content In Admin

    " context = { - 'page':'home', - 'pageTitle':'Welcome', - 'pageContent':page_content, - 'user': request.user, + "page": "home", + "pageTitle": "Welcome", + "pageContent": page_content, + "user": request.user, } return render(request, "welcome.html", context) + def about(request): try: page_content_obj = PageContent.objects.get(page="About") @@ -31,16 +33,17 @@ def about(request): page_content = page_content_obj.html_content else: page_content = page_content_obj.content - except Exception as e: + except Exception: page_content = "

    About

    Set About Page Content In Admin

    " context = { - 'page':'about', - 'pageTitle':'About', - 'pageContent':page_content, - 'user': request.user, + "page": "about", + "pageTitle": "About", + "pageContent": page_content, + "user": request.user, } return render(request, "tek_index.html", context) + def help(request): try: page_content_obj = PageContent.objects.get(page="Help") @@ -48,37 +51,40 @@ def help(request): page_content = page_content_obj.html_content else: page_content = page_content_obj.content - except Exception as e: + except Exception: page_content = "

    Help

    Set Help Page Content In Admin

    " context = { - 'page':'help', - 'pageTitle':'Help', - 'pageContent':page_content, - 'user': request.user, + "page": "help", + "pageTitle": "Help", + "pageContent": page_content, + "user": request.user, } return render(request, "tek_index.html", context) + @login_required def explore(request): context = { - 'page':'explore', - 'pageTitle':'Search', - 'pageContent':"

    In in mi vitae nibh posuere condimentum vitae eget quam. Etiam et urna id odio fringilla aliquet id hendrerit nisl. Ut sed ex vel felis rhoncus eleifend. Ut auctor facilisis vehicula. Ut sed dui nec ipsum pellentesque tempus.

    ", - 'user': request.user, + "page": "explore", + "pageTitle": "Search", + "pageContent": "

    In in mi vitae nibh posuere condimentum vitae eget quam. Etiam et urna id odio fringilla aliquet id hendrerit nisl. Ut sed ex vel felis rhoncus eleifend. Ut auctor facilisis vehicula. Ut sed dui nec ipsum pellentesque tempus.

    ", + "user": request.user, } return render(request, "explore.html", context) + def get_model_by_type(model_type): from TEKDB import models as tekmodels + searchable_models = { - 'resources': [tekmodels.Resources], - 'places': [tekmodels.Places], - 'locality': [tekmodels.Locality], - 'sources': [tekmodels.Citations], - 'citations': [tekmodels.Citations], - 'media': [tekmodels.Media], - 'activities': [tekmodels.ResourcesActivityEvents], - 'relationships': [ + "resources": [tekmodels.Resources], + "places": [tekmodels.Places], + "locality": [tekmodels.Locality], + "sources": [tekmodels.Citations], + "citations": [tekmodels.Citations], + "media": [tekmodels.Media], + "activities": [tekmodels.ResourcesActivityEvents], + "relationships": [ tekmodels.LocalityPlaceResourceEvent, tekmodels.MediaCitationEvents, tekmodels.PlacesCitationEvents, @@ -93,110 +99,123 @@ def get_model_by_type(model_type): tekmodels.ResourcesCitationEvents, tekmodels.ResourcesMediaEvents, ], - 'localityplaceresourceevents': [tekmodels.LocalityPlaceResourceEvent], - 'mediacitationevents': [tekmodels.MediaCitationEvents], - 'placescitationevents': [tekmodels.PlacesCitationEvents], - 'placesmediaevents': [tekmodels.PlacesMediaEvents], - 'placesresourcecitationevents': [tekmodels.PlacesResourceCitationEvents], - 'placesresourceevents': [tekmodels.PlacesResourceEvents], - 'placesresourcemediaevents': [tekmodels.PlacesResourceMediaEvents], - 'resourceactivitycitationevents': [tekmodels.ResourceActivityCitationEvents], - 'resourceactivitymediaevents': [tekmodels.ResourceActivityMediaEvents], - 'resourceresourceevents': [tekmodels.ResourceResourceEvents], - 'resourcesactivityevents': [tekmodels.ResourcesActivityEvents], - 'resourcescitationevents': [tekmodels.ResourcesCitationEvents], - 'resourcesmediaevents': [tekmodels.ResourcesMediaEvents], - 'people': [tekmodels.People], + "localityplaceresourceevents": [tekmodels.LocalityPlaceResourceEvent], + "mediacitationevents": [tekmodels.MediaCitationEvents], + "placescitationevents": [tekmodels.PlacesCitationEvents], + "placesmediaevents": [tekmodels.PlacesMediaEvents], + "placesresourcecitationevents": [tekmodels.PlacesResourceCitationEvents], + "placesresourceevents": [tekmodels.PlacesResourceEvents], + "placesresourcemediaevents": [tekmodels.PlacesResourceMediaEvents], + "resourceactivitycitationevents": [tekmodels.ResourceActivityCitationEvents], + "resourceactivitymediaevents": [tekmodels.ResourceActivityMediaEvents], + "resourceresourceevents": [tekmodels.ResourceResourceEvents], + "resourcesactivityevents": [tekmodels.ResourcesActivityEvents], + "resourcescitationevents": [tekmodels.ResourcesCitationEvents], + "resourcesmediaevents": [tekmodels.ResourcesMediaEvents], + "people": [tekmodels.People], } if model_type.lower() in searchable_models.keys(): return searchable_models[model_type.lower()] - elif model_type.lower() == 'all': - return sum([searchable_models[key] for key in ['resources','places', 'sources', 'media', 'activities']],[]) + elif model_type.lower() == "all": + return sum( + [ + searchable_models[key] + for key in ["resources", "places", "sources", "media", "activities"] + ], + [], + ) else: return [] + @login_required def get_by_model_type(request, model_type): context = { - 'query': '', - 'category': model_type, - 'page':'Results', - 'pageTitle':'Results', - 'pageContent':"

    Your search results:

    ", - 'user': request.user + "query": "", + "category": model_type, + "page": "Results", + "pageTitle": "Results", + "pageContent": "

    Your search results:

    ", + "user": request.user, } return render(request, "results.html", context) + def get_project_geography(): from TEKDB.settings import DATABASE_GEOGRAPHY - #RDH 2022-04-11: TODO: have users define their study area, save it to the DB, and format that like settings.DATABASE_GEOGRAPHY + # RDH 2022-04-11: TODO: have users define their study area, save it to the DB, and format that like settings.DATABASE_GEOGRAPHY # --FOOTHOLD-- return DATABASE_GEOGRAPHY + @login_required def get_by_model_id(request, model_type, id): - from TEKDB.settings import RECORD_ICONS state = "?%s" % request.GET.urlencode() - back_link = '%s%s' % ('/search/', state) + back_link = "%s%s" % ("/search/", state) models = get_model_by_type(model_type) if len(models) == 1: try: model = models[0] obj = model.objects.get(pk=int(id)) record_dict = obj.get_record_dict(request.user, 3857) - except Exception as e: + except Exception: obj = None - record_dict = {'name': "Error retrieving %s record with ID %s" % (model_type, id)} + record_dict = { + "name": "Error retrieving %s record with ID %s" % (model_type, id) + } else: obj = None - record_dict = {'name': 'Incorrect number of models returned for %s' % model_type} + record_dict = { + "name": "Incorrect number of models returned for %s" % model_type + } if state == "?": - state = '' + state = "" model_name = model_type - if model_type.lower() == 'places': - model_name = 'Place' - if model_type.lower() == 'resources': - model_name = 'Resource' - if model_type.lower() == 'resourcesactivityevents': - model_name = 'Activity' - if model_type.lower() == 'media': - model_name = 'Media' - if model_type.lower() == 'placesresourceevents': - model_name = 'Place-Resource Event' - if model_type.lower() == 'citations': - model_name = 'Bibliographic Source' + if model_type.lower() == "places": + model_name = "Place" + if model_type.lower() == "resources": + model_name = "Resource" + if model_type.lower() == "resourcesactivityevents": + model_name = "Activity" + if model_type.lower() == "media": + model_name = "Media" + if model_type.lower() == "placesresourceevents": + model_name = "Place-Resource Event" + if model_type.lower() == "citations": + model_name = "Bibliographic Source" context = { - 'page':'Record', - 'pageTitle':'Record', - 'pageContent':"

    Your record:

    ", - 'record': record_dict, - 'user': request.user, - 'model': model_type, - 'model_name': model_name, - 'id': id, - 'back_link': back_link, - 'state': state, + "page": "Record", + "pageTitle": "Record", + "pageContent": "

    Your record:

    ", + "record": record_dict, + "user": request.user, + "model": model_type, + "model_name": model_name, + "id": id, + "back_link": back_link, + "state": state, } - if 'map' in record_dict.keys() and not record_dict['map'] == None: + if "map" in record_dict.keys() and record_dict["map"] is not None: DATABASE_GEOGRAPHY = get_project_geography() - context['default_lon'] = DATABASE_GEOGRAPHY['default_lon'] - context['default_lat'] = DATABASE_GEOGRAPHY['default_lat'] - context['default_zoom'] = DATABASE_GEOGRAPHY['default_zoom'] - context['min_zoom'] = DATABASE_GEOGRAPHY['min_zoom'] - context['max_zoom'] = DATABASE_GEOGRAPHY['max_zoom'] - context['map_extent'] = DATABASE_GEOGRAPHY['map_extent'] + context["default_lon"] = DATABASE_GEOGRAPHY["default_lon"] + context["default_lat"] = DATABASE_GEOGRAPHY["default_lat"] + context["default_zoom"] = DATABASE_GEOGRAPHY["default_zoom"] + context["min_zoom"] = DATABASE_GEOGRAPHY["min_zoom"] + context["max_zoom"] = DATABASE_GEOGRAPHY["max_zoom"] + context["map_extent"] = DATABASE_GEOGRAPHY["map_extent"] - request.META.pop('QUERY_STRING') + request.META.pop("QUERY_STRING") return render(request, "record.html", context) + @login_required def download_media_file(request, model_type, id): models = get_model_by_type(model_type) @@ -204,7 +223,7 @@ def download_media_file(request, model_type, id): try: model = models[0] obj = model.objects.get(pk=id) - except Exception as e: + except Exception: obj = None else: obj = None @@ -212,23 +231,39 @@ def download_media_file(request, model_type, id): media = obj.media() if media: import os - from django.utils.encoding import smart_str from TEKDB.settings import MEDIA_ROOT - file_path = os.path.join(MEDIA_ROOT, media['file']) + file_path = os.path.join(MEDIA_ROOT, media["file"]) if os.path.exists(file_path): - with open(file_path, 'rb') as fh: - response = HttpResponse(fh.read(), content_type='application/force-download') - response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(file_path) + with open(file_path, "rb") as fh: + response = HttpResponse( + fh.read(), content_type="application/force-download" + ) + response["Content-Disposition"] = ( + "attachment; filename=%s" % os.path.basename(file_path) + ) return response else: return Http404 else: return Http404 + def get_sorted_keys(keys): sorted_keys = [] - for key in ['name', 'image', 'subtitle', 'data', 'relationships', 'map', 'link', 'enteredbyname', 'enteredbydate', 'modifiedbyname', 'modifiedbydate']: + for key in [ + "name", + "image", + "subtitle", + "data", + "relationships", + "map", + "link", + "enteredbyname", + "enteredbydate", + "modifiedbyname", + "modifiedbydate", + ]: if key in keys: key_idx = keys.index(key) keys.pop(key_idx) @@ -236,64 +271,80 @@ def get_sorted_keys(keys): sorted_keys = sorted_keys + keys return sorted_keys + def export_record_csv(record_dict, filename): import csv - csv_response = HttpResponse(content_type='text/csv') - csv_response['Content-Disposition'] = 'attachment; filename="%s.csv"' % filename + + csv_response = HttpResponse(content_type="text/csv") + csv_response["Content-Disposition"] = 'attachment; filename="%s.csv"' % filename writer = csv.writer(csv_response) for key in get_sorted_keys(list(record_dict.keys())): field = record_dict[key] - if type(field) == list and len(field) > 0 and type(field[0]) == dict: + if isinstance(field, list) and len(field) > 0 and isinstance(field[0], dict): for item in field: - if 'key' in item.keys() and 'value' in item.keys() and len(item.keys()) == 2: - if type(item['value']) == list and len(item['value']) > 0: - for sub_item in item['value']: - if type(sub_item) == dict and 'name' in sub_item.keys(): - writer.writerow(['%s - %s' %(key, item['key']), sub_item['name']]) + if ( + "key" in item.keys() + and "value" in item.keys() + and len(item.keys()) == 2 + ): + if isinstance(item["value"], list) and len(item["value"]) > 0: + for sub_item in item["value"]: + if isinstance(sub_item, dict) and "name" in sub_item.keys(): + writer.writerow( + ["%s - %s" % (key, item["key"]), sub_item["name"]] + ) else: - writer.writerow(['%s - %s' %(key, item['key']), str(sub_item)]) + writer.writerow( + ["%s - %s" % (key, item["key"]), str(sub_item)] + ) else: - writer.writerow(['%s - %s' % (key, item['key']), item['value']]) + writer.writerow(["%s - %s" % (key, item["key"]), item["value"]]) else: for list_key in item.keys(): - writer.writerow(['%s - %s' %(key, list_key), item[list_key]]) + writer.writerow(["%s - %s" % (key, list_key), item[list_key]]) else: writer.writerow([key, str(field)]) return csv_response + def export_record_xls(record_dict, filename): - import xlsxwriter, io + import io from xlsxwriter.workbook import Workbook + output = io.BytesIO() - workbook = Workbook(output, {'in_membory': True}) + workbook = Workbook(output, {"in_membory": True}) worksheet = workbook.add_worksheet() - bold = workbook.add_format({'bold': True}) + workbook.add_format({"bold": True}) row = 0 for key in get_sorted_keys(list(record_dict.keys())): field = record_dict[key] - if type(field) == list and len(field) > 0 and type(field[0]) == dict: + if isinstance(field, list) and len(field) > 0 and isinstance(field[0], dict): for item in field: - if 'key' in item.keys() and 'value' in item.keys() and len(item.keys()) == 2: - if type(item['value']) == list and len(item['value']) > 0: - for sub_item in item['value']: - if type(sub_item) == dict and 'name' in sub_item.keys(): - worksheet.write(row, 0, '%s - %s' %(key, item['key'])) - worksheet.write(row, 1, sub_item['name']) + if ( + "key" in item.keys() + and "value" in item.keys() + and len(item.keys()) == 2 + ): + if isinstance(item["value"], list) and len(item["value"]) > 0: + for sub_item in item["value"]: + if isinstance(sub_item, dict) and "name" in sub_item.keys(): + worksheet.write(row, 0, "%s - %s" % (key, item["key"])) + worksheet.write(row, 1, sub_item["name"]) row += 1 else: - worksheet.write(row, 0, '%s - %s' %(key, item['key'])) + worksheet.write(row, 0, "%s - %s" % (key, item["key"])) worksheet.write(row, 1, str(sub_item)) row += 1 else: - worksheet.write(row, 0, '%s - %s' %(key, item['key'])) + worksheet.write(row, 0, "%s - %s" % (key, item["key"])) try: - worksheet.write(row, 1, str(item['value'])) + worksheet.write(row, 1, str(item["value"])) except Exception: pass row += 1 else: for list_key in item.keys(): - worksheet.write(row, 0, '%s - %s' %(key, list_key)) + worksheet.write(row, 0, "%s - %s" % (key, list_key)) worksheet.write(row, 1, item[list_key]) row += 1 else: @@ -302,10 +353,14 @@ def export_record_xls(record_dict, filename): row += 1 workbook.close() output.seek(0) - xls_response = HttpResponse(output.read(), content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') - xls_response['Content-Disposition'] = "attachment; filename=\"%s.xlsx\"" % filename + xls_response = HttpResponse( + output.read(), + content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + ) + xls_response["Content-Disposition"] = 'attachment; filename="%s.xlsx"' % filename return xls_response + @login_required def export_by_model_id(request, model_type, id, format): models = get_model_by_type(model_type) @@ -315,83 +370,85 @@ def export_by_model_id(request, model_type, id, format): obj = model.objects.get(pk=id) record_dict = obj.get_record_dict(request.user, 4326) except Exception as e: - record_dict = {'error': 'unknown error', 'code': '%s' % e} + record_dict = {"error": "unknown error", "code": "%s" % e} else: obj = None if len(models) == 0: - error = 'No records returned for model: %s, id: %s' % (model_type, str(id)) + error = "No records returned for model: %s, id: %s" % (model_type, str(id)) elif len(models) > 0: - error = 'More than 1 records returned for model: %s, id: %s' % (model_type, str(id)) - record_dict = {'error': error} - - filename = "%s_%s_%s" % (model_type, str(id), record_dict['name']) - if format == 'xls': + error = "More than 1 records returned for model: %s, id: %s" % ( + model_type, + str(id), + ) + record_dict = {"error": error} + + filename = "%s_%s_%s" % (model_type, str(id), record_dict["name"]) + if format == "xls": return export_record_xls(record_dict, filename) - else: #CSV as default + else: # CSV as default return export_record_csv(record_dict, filename) + @login_required def search(request): import json - import TEKDB - from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.shortcuts import render - all_categories = ['places','resources','activities','sources','media'] - if request.method == 'POST': - query_string=request.POST['query'] - if 'category' in request.POST.keys(): + all_categories = ["places", "resources", "activities", "sources", "media"] + if request.method == "POST": + query_string = request.POST["query"] + if "category" in request.POST.keys(): try: - categories = request.POST['category'].split(',') - except Exception as e: + categories = request.POST["category"].split(",") + except Exception: categories = all_categories pass else: keys = request.POST.keys() categories = [] - if 'places' in keys and request.POST['places'] : - categories.append('places') - if 'resources' in keys and request.POST['resources']: - categories.append('resources') - if 'activities' in keys and request.POST['activities']: - categories.append('activities') - if 'citations' in keys and request.POST['citations']: - categories.append('sources') - if 'sources' in keys and request.POST['sources']: - categories.append('sources') - if 'media' in keys and request.POST['media']: - categories.append('media') + if "places" in keys and request.POST["places"]: + categories.append("places") + if "resources" in keys and request.POST["resources"]: + categories.append("resources") + if "activities" in keys and request.POST["activities"]: + categories.append("activities") + if "citations" in keys and request.POST["citations"]: + categories.append("sources") + if "sources" in keys and request.POST["sources"]: + categories.append("sources") + if "media" in keys and request.POST["media"]: + categories.append("media") else: - if 'query' in request.GET.keys(): - query_string = request.GET.get('query') - elif 'filter' in request.GET.urlencode(): - query_string = request.GET.get('filter') - if query_string == '' or query_string == True: + if "query" in request.GET.keys(): + query_string = request.GET.get("query") + elif "filter" in request.GET.urlencode(): + query_string = request.GET.get("filter") + if query_string == "" or query_string is True: query_string = None else: query_string = None - if 'category' in request.GET.keys(): - categories = [request.GET.get('category')] + if "category" in request.GET.keys(): + categories = [request.GET.get("category")] else: keys = request.GET.keys() categories = [] - if 'places' in keys and request.GET['places'] : - categories.append('places') - if 'resources' in keys and request.GET['resources']: - categories.append('resources') - if 'activities' in keys and request.GET['activities']: - categories.append('activities') - if 'citations' in keys and request.GET['citations']: - categories.append('sources') - if 'sources' in keys and request.GET['sources']: - categories.append('sources') - if 'media' in keys and request.GET['media']: - categories.append('media') + if "places" in keys and request.GET["places"]: + categories.append("places") + if "resources" in keys and request.GET["resources"]: + categories.append("resources") + if "activities" in keys and request.GET["activities"]: + categories.append("activities") + if "citations" in keys and request.GET["citations"]: + categories.append("sources") + if "sources" in keys and request.GET["sources"]: + categories.append("sources") + if "media" in keys and request.GET["media"]: + categories.append("media") if categories == []: - categories = ['all'] + categories = ["all"] # Zero tolerance for mispelled or 'all' categories. if it's not perfect, fail to 'all' for category in categories: @@ -399,48 +456,55 @@ def search(request): categories = all_categories break - category_checkboxes = '' + category_checkboxes = "" for category in all_categories: if category in categories: - checked = ' checked=true' + checked = " checked=true" else: - checked = '' - category_checkboxes += '
    %s
    ' % (category, category, category, checked, category, category.capitalize()) + checked = "" + category_checkboxes += ( + '
    %s
    ' + % (category, category, category, checked, category, category.capitalize()) + ) - if query_string in [None, '', '*']: + if query_string in [None, "", "*"]: query_string_visible = False else: query_string_visible = query_string - if query_string not in [None, '', '*']: + if query_string not in [None, "", "*"]: query_value = ' value="%s"' % query_string else: - query_value = '' - keyword_search_input = '\ - ' % query_value + query_value = "" + keyword_search_input = ( + '\ + ' + % query_value + ) resultlist = getResults(query_string, categories) - items_per_page = request.GET.get('items_per_page') + items_per_page = request.GET.get("items_per_page") if not items_per_page: items_per_page = 25 if int(items_per_page) < 0: items_per_page = len(resultlist) - page = request.GET.get('page') - if page == None: + page = request.GET.get("page") + if page is None: page = 1 - view = request.GET.get('view') - if view == None: - view = 'list' + view = request.GET.get("view") + if view is None: + view = "list" DATABASE_GEOGRAPHY = get_project_geography() try: config = Configuration.objects.all()[0] max_results = config.max_results_returned - except Exception as e: + except Exception: from TEKDB.settings import DEFAULT_MAXIMUM_RESULTS + max_results = DEFAULT_MAXIMUM_RESULTS pass @@ -449,40 +513,40 @@ def search(request): resultlist = resultlist[:max_results] context = { - 'items_per_page': items_per_page, - 'results_qs': resultlist, - 'results': json.dumps(resultlist), - 'too_many_results': too_many_results, - 'query': query_string, - 'keyword': query_string_visible, - 'keyword_search_input': keyword_search_input, - 'categories': json.dumps(categories), - 'category_checkboxes': category_checkboxes, - 'page':'Results', - 'pageTitle':'Results', - 'pageContent':"

    Your search results:

    ", - 'user': request.user, - 'view': view, - 'state': { - 'page' : int(page), - 'items_per_page' : int(items_per_page), + "items_per_page": items_per_page, + "results_qs": resultlist, + "results": json.dumps(resultlist), + "too_many_results": too_many_results, + "query": query_string, + "keyword": query_string_visible, + "keyword_search_input": keyword_search_input, + "categories": json.dumps(categories), + "category_checkboxes": category_checkboxes, + "page": "Results", + "pageTitle": "Results", + "pageContent": "

    Your search results:

    ", + "user": request.user, + "view": view, + "state": { + "page": int(page), + "items_per_page": int(items_per_page), }, - 'default_lon': DATABASE_GEOGRAPHY['default_lon'], - 'default_lat': DATABASE_GEOGRAPHY['default_lat'], - 'default_zoom': DATABASE_GEOGRAPHY['default_zoom'], - 'min_zoom': DATABASE_GEOGRAPHY['min_zoom'], - 'max_zoom': DATABASE_GEOGRAPHY['max_zoom'], - 'map_extent': DATABASE_GEOGRAPHY['map_extent'], + "default_lon": DATABASE_GEOGRAPHY["default_lon"], + "default_lat": DATABASE_GEOGRAPHY["default_lat"], + "default_zoom": DATABASE_GEOGRAPHY["default_zoom"], + "min_zoom": DATABASE_GEOGRAPHY["min_zoom"], + "max_zoom": DATABASE_GEOGRAPHY["max_zoom"], + "map_extent": DATABASE_GEOGRAPHY["map_extent"], } - request.META.pop('QUERY_STRING') + request.META.pop("QUERY_STRING") return render(request, "results.html", context) + def getResults(keyword_string, categories): - import TEKDB - if keyword_string == None: - keyword_string = '' + if keyword_string is None: + keyword_string = "" resultlist = [] @@ -494,45 +558,50 @@ def getResults(keyword_string, categories): for result in model_results: # Create JSON object to be resturned result_json = result.get_response_format() - if keyword_string != '': - result_json['rank'] = result.rank - result_json['similarity'] = result.similarity + if keyword_string != "": + result_json["rank"] = result.rank + result_json["similarity"] = result.similarity else: - result_json['rank'] = 0 - result_json['similarity'] = 0 + result_json["rank"] = 0 + result_json["similarity"] = 0 resultlist.append(result_json) # Sort results from all models by rank, then similarity (descending) - return sorted(resultlist, key=lambda res: (res['rank'], res['similarity']), reverse=True) + return sorted( + resultlist, key=lambda res: (res["rank"], res["similarity"]), reverse=True + ) + def get_category_list(request): categories = [] - for category in ['places','resources','activities','sources','media']: - if request.GET.get(category) == 'true': + for category in ["places", "resources", "activities", "sources", "media"]: + if request.GET.get(category) == "true": categories.append(category) return categories + @login_required def download(request): categories = get_category_list(request) - results = getResults(request.GET.get('query'), categories) - format_type = request.GET.get('format') - filename = 'TEK_RESULTS' - fieldnames = ['id','name','description','type'] + results = getResults(request.GET.get("query"), categories) + format_type = request.GET.get("format") + filename = "TEK_RESULTS" + fieldnames = ["id", "name", "description", "type"] rows = [] for row in results: row_dict = {} for field in fieldnames: - row_dict[field] = row[field] if row[field] else ' ' + row_dict[field] = row[field] if row[field] else " " rows.append(row_dict) - if format_type == 'xlsx': - import xlsxwriter, io + if format_type == "xlsx": + import io from xlsxwriter.workbook import Workbook + output = io.BytesIO() - workbook = Workbook(output, {'in_membory': True}) + workbook = Workbook(output, {"in_membory": True}) worksheet = workbook.add_worksheet() - bold = workbook.add_format({'bold': True}) + bold = workbook.add_format({"bold": True}) rows.insert(0, fieldnames) row = 0 col = 0 @@ -547,15 +616,19 @@ def download(request): col = 0 workbook.close() output.seek(0) - xls_response = HttpResponse(output.read(), content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') - xls_response['Content-Disposition'] = "attachment; filename=%s.xlsx" % filename + xls_response = HttpResponse( + output.read(), + content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + ) + xls_response["Content-Disposition"] = "attachment; filename=%s.xlsx" % filename return xls_response else: # if format_type == 'csv': import csv - csv_response = HttpResponse(content_type='text/csv') - csv_response['Content-Disposition'] = 'attachment; filename="%s.csv"' % filename + + csv_response = HttpResponse(content_type="text/csv") + csv_response["Content-Disposition"] = 'attachment; filename="%s.csv"' % filename writer = csv.DictWriter(csv_response, fieldnames=fieldnames) writer.writeheader() for row in rows: diff --git a/TEKDB/login/admin.py b/TEKDB/login/admin.py index 8c38f3f3..846f6b40 100644 --- a/TEKDB/login/admin.py +++ b/TEKDB/login/admin.py @@ -1,3 +1 @@ -from django.contrib import admin - # Register your models here. diff --git a/TEKDB/login/models.py b/TEKDB/login/models.py index 71a83623..6b202199 100644 --- a/TEKDB/login/models.py +++ b/TEKDB/login/models.py @@ -1,3 +1 @@ -from django.db import models - # Create your models here. diff --git a/TEKDB/login/urls.py b/TEKDB/login/urls.py index 064610b9..34538d68 100644 --- a/TEKDB/login/urls.py +++ b/TEKDB/login/urls.py @@ -3,8 +3,8 @@ from . import views urlpatterns = [ - path('create', views.create, name='create'), - path('forgot', views.forgot, name='forgot'), - path('', views.index, name='index'), + path("create", views.create, name="create"), + path("forgot", views.forgot, name="forgot"), + path("", views.index, name="index"), ] - #url(r'^logout$', views.logout, name='logout'), +# url(r'^logout$', views.logout, name='logout'), diff --git a/TEKDB/login/views.py b/TEKDB/login/views.py index f7fc13e0..3f92ad70 100644 --- a/TEKDB/login/views.py +++ b/TEKDB/login/views.py @@ -1,53 +1,56 @@ # Create your views here. -from django.http import HttpResponse from django.http.response import JsonResponse from django.shortcuts import render from django.contrib.auth import authenticate from django.contrib.auth import login as auth_login -from django.contrib.auth import logout + def index(request): context = { "pageTitle": "Login", } return render(request, "index.html", context) - #return HttpResponse("

    Server error: Already Logged In") + # return HttpResponse("

    Server error: Already Logged In") + def forgot(request): context = { "pageTitle": "Forgot Login", } return render(request, "forgot.html", context) - #return HttpResponse("

    Forgot Password") + # return HttpResponse("

    Forgot Password") + def login(request): - username = request.POST['username'] - password = request.POST['password'] + username = request.POST["username"] + password = request.POST["password"] user = authenticate(request, username=username, password=password) if user is not None: auth_login(request, user) from explore.views import explore + return explore(request) else: context = { "errorcode": 403, "error": "User name or password incorrect.", - 'page':'error', - 'pageTitle':'Error', - 'pageContent':"

    There was an error with your request. Please see below for details.

    ", - 'user': request.user + "page": "error", + "pageTitle": "Error", + "pageContent": "

    There was an error with your request. Please see below for details.

    ", + "user": request.user, } return render(request, "error.html", context) + def login_logic(request, context={}): - username = request.POST['username'] - password = request.POST['password'] + username = request.POST["username"] + password = request.POST["password"] user = authenticate(username=username, password=password) if user is not None: auth_login(request, user) context = { - 'success': True, - 'username': user.username, + "success": True, + "username": user.username, } return context else: @@ -56,9 +59,10 @@ def login_logic(request, context={}): } return context + def login_async(request): - login_user = login_logic(request) # run default logic + login_user = login_logic(request) # run default logic context = { - 'success': login_user['success'], + "success": login_user["success"], } - return JsonResponse(context) \ No newline at end of file + return JsonResponse(context) diff --git a/TEKDB/manage.py b/TEKDB/manage.py index b3c83e17..6811de8e 100755 --- a/TEKDB/manage.py +++ b/TEKDB/manage.py @@ -11,7 +11,7 @@ # issue is really that Django is missing to avoid masking other # exceptions on Python 2. try: - import django + import django # noqa: F401 except ImportError: raise ImportError( "Couldn't import Django. Are you sure it's installed and " diff --git a/TEKDB/pyproject.toml b/TEKDB/pyproject.toml new file mode 100644 index 00000000..34e543ed --- /dev/null +++ b/TEKDB/pyproject.toml @@ -0,0 +1,8 @@ +[tool.ruff] +exclude = ["*/migrations/*"] + +[tool.ruff.format] +quote-style = "double" + +[tool.ruff.lint] +extend-safe-fixes = ["E711"] \ No newline at end of file diff --git a/TEKDB/requirements.txt b/TEKDB/requirements.txt index de1b8369..f3768a1a 100644 --- a/TEKDB/requirements.txt +++ b/TEKDB/requirements.txt @@ -29,3 +29,5 @@ urllib3>=1.26.5 #OPTIONAL, BUT LOVELY FOR DEBUGGING ipdb ipython +# FORMATTING AND LINTING +ruff \ No newline at end of file diff --git a/docs/Data/models_new_fk.py b/docs/Data/models_new_fk.py index 8601661d..2f4dabb6 100644 --- a/docs/Data/models_new_fk.py +++ b/docs/Data/models_new_fk.py @@ -13,625 +13,1227 @@ class Citations(models.Model): - citationid = models.ForeignKey('Placescitationevents', db_column='CitationID', primary_key=True) # Field name made lowercase. - referencetype = models.CharField(db_column='ReferenceType', max_length=255, blank=True, null=True) # Field name made lowercase. - referencetext = models.CharField(db_column='ReferenceText', max_length=50, blank=True, null=True) # Field name made lowercase. - authortype = models.CharField(db_column='AuthorType', max_length=255, blank=True, null=True) # Field name made lowercase. - authorprimary = models.CharField(db_column='AuthorPrimary', max_length=255, blank=True, null=True) # Field name made lowercase. - authorsecondary = models.CharField(db_column='AuthorSecondary', max_length=255, blank=True, null=True) # Field name made lowercase. - intervieweeid = models.IntegerField(db_column='IntervieweeID', blank=True, null=True) # Field name made lowercase. - interviewerid = models.IntegerField(db_column='InterviewerID', blank=True, null=True) # Field name made lowercase. - placeofinterview = models.CharField(db_column='PlaceofInterview', max_length=255, blank=True, null=True) # Field name made lowercase. - year = models.IntegerField(db_column='Year', blank=True, null=True) # Field name made lowercase. - title = models.TextField(db_column='Title', blank=True, null=True) # Field name made lowercase. - seriestitle = models.CharField(db_column='SeriesTitle', max_length=255, blank=True, null=True) # Field name made lowercase. - seriesvolume = models.CharField(db_column='SeriesVolume', max_length=50, blank=True, null=True) # Field name made lowercase. - serieseditor = models.CharField(db_column='SeriesEditor', max_length=255, blank=True, null=True) # Field name made lowercase. - publisher = models.CharField(db_column='Publisher', max_length=100, blank=True, null=True) # Field name made lowercase. - publishercity = models.CharField(db_column='PublisherCity', max_length=255, blank=True, null=True) # Field name made lowercase. - preparedfor = models.CharField(db_column='PreparedFor', max_length=100, blank=True, null=True) # Field name made lowercase. - comments = models.TextField(db_column='Comments', blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. - - class Meta: - managed = False - db_table = 'citations' + citationid = models.ForeignKey( + "Placescitationevents", db_column="CitationID", primary_key=True + ) # Field name made lowercase. + referencetype = models.CharField( + db_column="ReferenceType", max_length=255, blank=True, null=True + ) # Field name made lowercase. + referencetext = models.CharField( + db_column="ReferenceText", max_length=50, blank=True, null=True + ) # Field name made lowercase. + authortype = models.CharField( + db_column="AuthorType", max_length=255, blank=True, null=True + ) # Field name made lowercase. + authorprimary = models.CharField( + db_column="AuthorPrimary", max_length=255, blank=True, null=True + ) # Field name made lowercase. + authorsecondary = models.CharField( + db_column="AuthorSecondary", max_length=255, blank=True, null=True + ) # Field name made lowercase. + intervieweeid = models.IntegerField( + db_column="IntervieweeID", blank=True, null=True + ) # Field name made lowercase. + interviewerid = models.IntegerField( + db_column="InterviewerID", blank=True, null=True + ) # Field name made lowercase. + placeofinterview = models.CharField( + db_column="PlaceofInterview", max_length=255, blank=True, null=True + ) # Field name made lowercase. + year = models.IntegerField( + db_column="Year", blank=True, null=True + ) # Field name made lowercase. + title = models.TextField( + db_column="Title", blank=True, null=True + ) # Field name made lowercase. + seriestitle = models.CharField( + db_column="SeriesTitle", max_length=255, blank=True, null=True + ) # Field name made lowercase. + seriesvolume = models.CharField( + db_column="SeriesVolume", max_length=50, blank=True, null=True + ) # Field name made lowercase. + serieseditor = models.CharField( + db_column="SeriesEditor", max_length=255, blank=True, null=True + ) # Field name made lowercase. + publisher = models.CharField( + db_column="Publisher", max_length=100, blank=True, null=True + ) # Field name made lowercase. + publishercity = models.CharField( + db_column="PublisherCity", max_length=255, blank=True, null=True + ) # Field name made lowercase. + preparedfor = models.CharField( + db_column="PreparedFor", max_length=100, blank=True, null=True + ) # Field name made lowercase. + comments = models.TextField( + db_column="Comments", blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. + + class Meta: + managed = False + db_table = "citations" class Currentversion(models.Model): - id = models.IntegerField(db_column='ID', primary_key=True) # Field name made lowercase. - backendversion = models.IntegerField(db_column='BackendVersion', blank=True, null=True) # Field name made lowercase. - frontendversion = models.IntegerField(db_column='FrontendVersion', blank=True, null=True) # Field name made lowercase. + id = models.IntegerField( + db_column="ID", primary_key=True + ) # Field name made lowercase. + backendversion = models.IntegerField( + db_column="BackendVersion", blank=True, null=True + ) # Field name made lowercase. + frontendversion = models.IntegerField( + db_column="FrontendVersion", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'currentversion' + db_table = "currentversion" class Locality(models.Model): - localityid = models.IntegerField(db_column='LocalityID', primary_key=True) # Field name made lowercase. - placeid = models.ForeignKey('Places', db_column='PlaceID', blank=True, null=True) # Field name made lowercase. - englishname = models.CharField(db_column='EnglishName', max_length=255, blank=True, null=True) # Field name made lowercase. - indigenousname = models.CharField(db_column='IndigenousName', max_length=255, blank=True, null=True) # Field name made lowercase. - localitytype = models.CharField(db_column='LocalityType', max_length=255, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + localityid = models.IntegerField( + db_column="LocalityID", primary_key=True + ) # Field name made lowercase. + placeid = models.ForeignKey( + "Places", db_column="PlaceID", blank=True, null=True + ) # Field name made lowercase. + englishname = models.CharField( + db_column="EnglishName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + indigenousname = models.CharField( + db_column="IndigenousName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + localitytype = models.CharField( + db_column="LocalityType", max_length=255, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'locality' + db_table = "locality" class Localitygisselections(models.Model): - localityid = models.IntegerField(db_column='LocalityID', blank=True, null=True) # Field name made lowercase. - localitylabel = models.CharField(db_column='LocalityLabel', max_length=255, blank=True, null=True) # Field name made lowercase. - sourcefc = models.CharField(db_column='SourceFC', max_length=255, blank=True, null=True) # Field name made lowercase. + localityid = models.IntegerField( + db_column="LocalityID", blank=True, null=True + ) # Field name made lowercase. + localitylabel = models.CharField( + db_column="LocalityLabel", max_length=255, blank=True, null=True + ) # Field name made lowercase. + sourcefc = models.CharField( + db_column="SourceFC", max_length=255, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'localitygisselections' + db_table = "localitygisselections" class Localityplaceresourceevent(models.Model): - placeresourceid = models.ForeignKey('Placesresourceevents', db_column='PlaceResourceID') # Field name made lowercase. - localityid = models.ForeignKey(Locality, db_column='LocalityID') # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + placeresourceid = models.ForeignKey( + "Placesresourceevents", db_column="PlaceResourceID" + ) # Field name made lowercase. + localityid = models.ForeignKey( + Locality, db_column="LocalityID" + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'localityplaceresourceevent' - unique_together = (('placeresourceid', 'localityid'),) + db_table = "localityplaceresourceevent" + unique_together = (("placeresourceid", "localityid"),) class Lookupactivity(models.Model): - activity = models.CharField(db_column='Activity', primary_key=True, max_length=255) # Field name made lowercase. + activity = models.CharField( + db_column="Activity", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'lookupactivity' + db_table = "lookupactivity" class Lookupauthortype(models.Model): - authortype = models.CharField(db_column='AuthorType', unique=True, max_length=50) # Field name made lowercase. + authortype = models.CharField( + db_column="AuthorType", unique=True, max_length=50 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'lookupauthortype' + db_table = "lookupauthortype" class Lookupcustomaryuse(models.Model): - usedfor = models.CharField(db_column='UsedFor', primary_key=True, max_length=255) # Field name made lowercase. + usedfor = models.CharField( + db_column="UsedFor", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'lookupcustomaryuse' + db_table = "lookupcustomaryuse" class Lookuphabitat(models.Model): - habitat = models.CharField(db_column='Habitat', primary_key=True, max_length=100) # Field name made lowercase. + habitat = models.CharField( + db_column="Habitat", primary_key=True, max_length=100 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'lookuphabitat' + db_table = "lookuphabitat" class Lookuplocalitytype(models.Model): - localitytype = models.CharField(db_column='LocalityType', primary_key=True, max_length=255) # Field name made lowercase. + localitytype = models.CharField( + db_column="LocalityType", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'lookuplocalitytype' + db_table = "lookuplocalitytype" class Lookupmediatype(models.Model): - mediatype = models.CharField(db_column='MediaType', primary_key=True, max_length=255) # Field name made lowercase. - mediacategory = models.CharField(db_column='MediaCategory', max_length=255, blank=True, null=True) # Field name made lowercase. + mediatype = models.CharField( + db_column="MediaType", primary_key=True, max_length=255 + ) # Field name made lowercase. + mediacategory = models.CharField( + db_column="MediaCategory", max_length=255, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'lookupmediatype' + db_table = "lookupmediatype" class Lookupparticipants(models.Model): - participants = models.CharField(db_column='Participants', primary_key=True, max_length=255) # Field name made lowercase. + participants = models.CharField( + db_column="Participants", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'lookupparticipants' + db_table = "lookupparticipants" class Lookuppartused(models.Model): - partused = models.CharField(db_column='PartUsed', primary_key=True, max_length=255) # Field name made lowercase. + partused = models.CharField( + db_column="PartUsed", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'lookuppartused' + db_table = "lookuppartused" class Lookupplanningunit(models.Model): - planningunitid = models.IntegerField(db_column='PlanningUnitID', primary_key=True) # Field name made lowercase. - planningunitname = models.CharField(db_column='PlanningUnitName', max_length=100, blank=True, null=True) # Field name made lowercase. + planningunitid = models.IntegerField( + db_column="PlanningUnitID", primary_key=True + ) # Field name made lowercase. + planningunitname = models.CharField( + db_column="PlanningUnitName", max_length=100, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'lookupplanningunit' + db_table = "lookupplanningunit" class Lookupreferencetype(models.Model): - documenttype = models.CharField(db_column='DocumentType', primary_key=True, max_length=25) # Field name made lowercase. + documenttype = models.CharField( + db_column="DocumentType", primary_key=True, max_length=25 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'lookupreferencetype' + db_table = "lookupreferencetype" class Lookupresourcegroup(models.Model): - resourceclassificationgroup = models.CharField(db_column='ResourceClassificationGroup', primary_key=True, max_length=255) # Field name made lowercase. + resourceclassificationgroup = models.CharField( + db_column="ResourceClassificationGroup", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'lookupresourcegroup' + db_table = "lookupresourcegroup" class Lookupseason(models.Model): - season = models.CharField(db_column='Season', primary_key=True, max_length=255) # Field name made lowercase. + season = models.CharField( + db_column="Season", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'lookupseason' + db_table = "lookupseason" class Lookuptechniques(models.Model): - techniques = models.CharField(db_column='Techniques', primary_key=True, max_length=255) # Field name made lowercase. + techniques = models.CharField( + db_column="Techniques", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'lookuptechniques' + db_table = "lookuptechniques" class Lookuptiming(models.Model): - timing = models.CharField(db_column='Timing', primary_key=True, max_length=255) # Field name made lowercase. + timing = models.CharField( + db_column="Timing", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'lookuptiming' + db_table = "lookuptiming" class Lookuptribe(models.Model): - id = models.IntegerField(db_column='ID', primary_key=True) # Field name made lowercase. - tribeunit = models.CharField(db_column='TribeUnit', max_length=50, blank=True, null=True) # Field name made lowercase. - tribe = models.CharField(db_column='Tribe', max_length=100, blank=True, null=True) # Field name made lowercase. - federaltribe = models.CharField(db_column='FederalTribe', max_length=100, blank=True, null=True) # Field name made lowercase. + id = models.IntegerField( + db_column="ID", primary_key=True + ) # Field name made lowercase. + tribeunit = models.CharField( + db_column="TribeUnit", max_length=50, blank=True, null=True + ) # Field name made lowercase. + tribe = models.CharField( + db_column="Tribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + federaltribe = models.CharField( + db_column="FederalTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'lookuptribe' + db_table = "lookuptribe" class Lookupuserinfo(models.Model): - username = models.CharField(db_column='UserName', max_length=100, blank=True, null=True) # Field name made lowercase. - usingcustomusername = models.IntegerField(db_column='UsingCustomUsername') # Field name made lowercase. - usertitle = models.CharField(db_column='UserTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - useraffiliation = models.CharField(db_column='UserAffiliation', max_length=100, blank=True, null=True) # Field name made lowercase. + username = models.CharField( + db_column="UserName", max_length=100, blank=True, null=True + ) # Field name made lowercase. + usingcustomusername = models.IntegerField( + db_column="UsingCustomUsername" + ) # Field name made lowercase. + usertitle = models.CharField( + db_column="UserTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + useraffiliation = models.CharField( + db_column="UserAffiliation", max_length=100, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'lookupuserinfo' + db_table = "lookupuserinfo" class Media(models.Model): - mediaid = models.IntegerField(db_column='MediaID', primary_key=True) # Field name made lowercase. - mediatype = models.CharField(db_column='MediaType', max_length=255, blank=True, null=True) # Field name made lowercase. - medianame = models.CharField(db_column='MediaName', max_length=255, blank=True, null=True) # Field name made lowercase. - mediadescription = models.TextField(db_column='MediaDescription', blank=True, null=True) # Field name made lowercase. - medialink = models.CharField(db_column='MediaLink', max_length=255, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + mediaid = models.IntegerField( + db_column="MediaID", primary_key=True + ) # Field name made lowercase. + mediatype = models.CharField( + db_column="MediaType", max_length=255, blank=True, null=True + ) # Field name made lowercase. + medianame = models.CharField( + db_column="MediaName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + mediadescription = models.TextField( + db_column="MediaDescription", blank=True, null=True + ) # Field name made lowercase. + medialink = models.CharField( + db_column="MediaLink", max_length=255, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'media' + db_table = "media" class Mediacitationevents(models.Model): - mediaid = models.ForeignKey(Media, db_column='MediaID') # Field name made lowercase. - citationid = models.ForeignKey(Citations, db_column='CitationID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=255, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + mediaid = models.ForeignKey( + Media, db_column="MediaID" + ) # Field name made lowercase. + citationid = models.ForeignKey( + Citations, db_column="CitationID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=255, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'mediacitationevents' - unique_together = (('mediaid', 'citationid'),) + db_table = "mediacitationevents" + unique_together = (("mediaid", "citationid"),) class People(models.Model): - personid = models.IntegerField(db_column='PersonID', primary_key=True) # Field name made lowercase. - firstname = models.CharField(db_column='FirstName', max_length=255, blank=True, null=True) # Field name made lowercase. - lastname = models.CharField(db_column='LastName', max_length=255, blank=True, null=True) # Field name made lowercase. - yearborn = models.IntegerField(db_column='YearBorn', blank=True, null=True) # Field name made lowercase. - village = models.CharField(db_column='Village', max_length=255, blank=True, null=True) # Field name made lowercase. - relationshiptootherpeople = models.TextField(db_column='RelationshipToOtherPeople', blank=True, null=True) # Field name made lowercase. + personid = models.IntegerField( + db_column="PersonID", primary_key=True + ) # Field name made lowercase. + firstname = models.CharField( + db_column="FirstName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + lastname = models.CharField( + db_column="LastName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + yearborn = models.IntegerField( + db_column="YearBorn", blank=True, null=True + ) # Field name made lowercase. + village = models.CharField( + db_column="Village", max_length=255, blank=True, null=True + ) # Field name made lowercase. + relationshiptootherpeople = models.TextField( + db_column="RelationshipToOtherPeople", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'people' + db_table = "people" class Placealtindigenousname(models.Model): - altindigenousnameid = models.IntegerField(db_column='AltIndigenousNameID', primary_key=True) # Field name made lowercase. - placeid = models.IntegerField(db_column='PlaceID', blank=True, null=True) # Field name made lowercase. - altindigenousname = models.CharField(db_column='AltIndigenousName', max_length=255, blank=True, null=True) # Field name made lowercase. + altindigenousnameid = models.IntegerField( + db_column="AltIndigenousNameID", primary_key=True + ) # Field name made lowercase. + placeid = models.IntegerField( + db_column="PlaceID", blank=True, null=True + ) # Field name made lowercase. + altindigenousname = models.CharField( + db_column="AltIndigenousName", max_length=255, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'placealtindigenousname' + db_table = "placealtindigenousname" class Placegisselections(models.Model): - placeid = models.IntegerField(db_column='PlaceID', blank=True, null=True) # Field name made lowercase. - placelabel = models.CharField(db_column='PlaceLabel', max_length=255, blank=True, null=True) # Field name made lowercase. - sourcefc = models.CharField(db_column='SourceFC', max_length=255, blank=True, null=True) # Field name made lowercase. + placeid = models.IntegerField( + db_column="PlaceID", blank=True, null=True + ) # Field name made lowercase. + placelabel = models.CharField( + db_column="PlaceLabel", max_length=255, blank=True, null=True + ) # Field name made lowercase. + sourcefc = models.CharField( + db_column="SourceFC", max_length=255, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'placegisselections' + db_table = "placegisselections" class Places(models.Model): - placeid = models.IntegerField(db_column='PlaceID', primary_key=True) # Field name made lowercase. - indigenousplacename = models.CharField(db_column='IndigenousPlaceName', max_length=255, blank=True, null=True) # Field name made lowercase. - indigenousplacenamemeaning = models.CharField(db_column='IndigenousPlaceNameMeaning', max_length=255, blank=True, null=True) # Field name made lowercase. - englishplacename = models.CharField(db_column='EnglishPlaceName', max_length=255, blank=True, null=True) # Field name made lowercase. - planningunitid = models.IntegerField(db_column='PlanningUnitID', blank=True, null=True) # Field name made lowercase. - primaryhabitat = models.CharField(db_column='PrimaryHabitat', max_length=100, blank=True, null=True) # Field name made lowercase. - tribeid = models.IntegerField(db_column='TribeID', blank=True, null=True) # Field name made lowercase. - islocked = models.IntegerField(db_column='IsLocked') # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + placeid = models.IntegerField( + db_column="PlaceID", primary_key=True + ) # Field name made lowercase. + indigenousplacename = models.CharField( + db_column="IndigenousPlaceName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + indigenousplacenamemeaning = models.CharField( + db_column="IndigenousPlaceNameMeaning", max_length=255, blank=True, null=True + ) # Field name made lowercase. + englishplacename = models.CharField( + db_column="EnglishPlaceName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + planningunitid = models.IntegerField( + db_column="PlanningUnitID", blank=True, null=True + ) # Field name made lowercase. + primaryhabitat = models.CharField( + db_column="PrimaryHabitat", max_length=100, blank=True, null=True + ) # Field name made lowercase. + tribeid = models.IntegerField( + db_column="TribeID", blank=True, null=True + ) # Field name made lowercase. + islocked = models.IntegerField(db_column="IsLocked") # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'places' + db_table = "places" class Placescitationevents(models.Model): - placeid = models.ForeignKey(Places, db_column='PlaceID') # Field name made lowercase. - citationid = models.IntegerField(db_column='CitationID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=255, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + placeid = models.ForeignKey( + Places, db_column="PlaceID" + ) # Field name made lowercase. + citationid = models.IntegerField( + db_column="CitationID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=255, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'placescitationevents' - unique_together = (('placeid', 'citationid'),) + db_table = "placescitationevents" + unique_together = (("placeid", "citationid"),) class Placesmediaevents(models.Model): - placeid = models.ForeignKey(Places, db_column='PlaceID') # Field name made lowercase. - mediaid = models.ForeignKey(Media, db_column='MediaID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=50, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + placeid = models.ForeignKey( + Places, db_column="PlaceID" + ) # Field name made lowercase. + mediaid = models.ForeignKey( + Media, db_column="MediaID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=50, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'placesmediaevents' - unique_together = (('placeid', 'mediaid'),) + db_table = "placesmediaevents" + unique_together = (("placeid", "mediaid"),) class Placesresourcecitationevents(models.Model): - placeresourceid = models.ForeignKey('Placesresourceevents', db_column='PlaceResourceID') # Field name made lowercase. - citationid = models.IntegerField(db_column='CitationID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=255, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + placeresourceid = models.ForeignKey( + "Placesresourceevents", db_column="PlaceResourceID" + ) # Field name made lowercase. + citationid = models.IntegerField( + db_column="CitationID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=255, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'placesresourcecitationevents' - unique_together = (('placeresourceid', 'citationid'),) + db_table = "placesresourcecitationevents" + unique_together = (("placeresourceid", "citationid"),) class Placesresourceevents(models.Model): - placeresourceid = models.IntegerField(db_column='PlaceResourceID', primary_key=True) # Field name made lowercase. - placeid = models.ForeignKey(Places, db_column='PlaceID', blank=True, null=True) # Field name made lowercase. - resourceid = models.IntegerField(db_column='ResourceID', blank=True, null=True) # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - partused = models.CharField(db_column='PartUsed', max_length=255, blank=True, null=True) # Field name made lowercase. - customaryuse = models.CharField(db_column='CustomaryUse', max_length=255, blank=True, null=True) # Field name made lowercase. - barterresource = models.IntegerField(db_column='BarterResource') # Field name made lowercase. - season = models.CharField(db_column='Season', max_length=255, blank=True, null=True) # Field name made lowercase. - timing = models.CharField(db_column='Timing', max_length=255, blank=True, null=True) # Field name made lowercase. - january = models.IntegerField(db_column='January') # Field name made lowercase. - february = models.IntegerField(db_column='February') # Field name made lowercase. - march = models.IntegerField(db_column='March') # Field name made lowercase. - april = models.IntegerField(db_column='April') # Field name made lowercase. - may = models.IntegerField(db_column='May') # Field name made lowercase. - june = models.IntegerField(db_column='June') # Field name made lowercase. - july = models.IntegerField(db_column='July') # Field name made lowercase. - august = models.IntegerField(db_column='August') # Field name made lowercase. - september = models.IntegerField(db_column='September') # Field name made lowercase. - october = models.IntegerField(db_column='October') # Field name made lowercase. - november = models.IntegerField(db_column='November') # Field name made lowercase. - december = models.IntegerField(db_column='December') # Field name made lowercase. - year = models.SmallIntegerField(db_column='Year', blank=True, null=True) # Field name made lowercase. - islocked = models.IntegerField(db_column='IsLocked') # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. - - class Meta: - managed = False - db_table = 'placesresourceevents' + placeresourceid = models.IntegerField( + db_column="PlaceResourceID", primary_key=True + ) # Field name made lowercase. + placeid = models.ForeignKey( + Places, db_column="PlaceID", blank=True, null=True + ) # Field name made lowercase. + resourceid = models.IntegerField( + db_column="ResourceID", blank=True, null=True + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + partused = models.CharField( + db_column="PartUsed", max_length=255, blank=True, null=True + ) # Field name made lowercase. + customaryuse = models.CharField( + db_column="CustomaryUse", max_length=255, blank=True, null=True + ) # Field name made lowercase. + barterresource = models.IntegerField( + db_column="BarterResource" + ) # Field name made lowercase. + season = models.CharField( + db_column="Season", max_length=255, blank=True, null=True + ) # Field name made lowercase. + timing = models.CharField( + db_column="Timing", max_length=255, blank=True, null=True + ) # Field name made lowercase. + january = models.IntegerField(db_column="January") # Field name made lowercase. + february = models.IntegerField(db_column="February") # Field name made lowercase. + march = models.IntegerField(db_column="March") # Field name made lowercase. + april = models.IntegerField(db_column="April") # Field name made lowercase. + may = models.IntegerField(db_column="May") # Field name made lowercase. + june = models.IntegerField(db_column="June") # Field name made lowercase. + july = models.IntegerField(db_column="July") # Field name made lowercase. + august = models.IntegerField(db_column="August") # Field name made lowercase. + september = models.IntegerField(db_column="September") # Field name made lowercase. + october = models.IntegerField(db_column="October") # Field name made lowercase. + november = models.IntegerField(db_column="November") # Field name made lowercase. + december = models.IntegerField(db_column="December") # Field name made lowercase. + year = models.SmallIntegerField( + db_column="Year", blank=True, null=True + ) # Field name made lowercase. + islocked = models.IntegerField(db_column="IsLocked") # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. + + class Meta: + managed = False + db_table = "placesresourceevents" class Placesresourcemediaevents(models.Model): - placeresourceid = models.ForeignKey(Placesresourceevents, db_column='PlaceResourceID') # Field name made lowercase. - mediaid = models.IntegerField(db_column='MediaID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=50, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + placeresourceid = models.ForeignKey( + Placesresourceevents, db_column="PlaceResourceID" + ) # Field name made lowercase. + mediaid = models.IntegerField(db_column="MediaID") # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=50, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'placesresourcemediaevents' - unique_together = (('placeresourceid', 'mediaid'),) + db_table = "placesresourcemediaevents" + unique_together = (("placeresourceid", "mediaid"),) class Resourceactivitycitationevents(models.Model): - resourceactivityid = models.ForeignKey('Resourcesactivityevents', db_column='ResourceActivityID') # Field name made lowercase. - citationid = models.IntegerField(db_column='CitationID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=255, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + resourceactivityid = models.ForeignKey( + "Resourcesactivityevents", db_column="ResourceActivityID" + ) # Field name made lowercase. + citationid = models.IntegerField( + db_column="CitationID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=255, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'resourceactivitycitationevents' - unique_together = (('resourceactivityid', 'citationid'),) + db_table = "resourceactivitycitationevents" + unique_together = (("resourceactivityid", "citationid"),) class Resourceactivitymediaevents(models.Model): - resourceactivityid = models.ForeignKey('Resourcesactivityevents', db_column='ResourceActivityID') # Field name made lowercase. - mediaid = models.IntegerField(db_column='MediaID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=50, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + resourceactivityid = models.ForeignKey( + "Resourcesactivityevents", db_column="ResourceActivityID" + ) # Field name made lowercase. + mediaid = models.IntegerField(db_column="MediaID") # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=50, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'resourceactivitymediaevents' - unique_together = (('resourceactivityid', 'mediaid'),) + db_table = "resourceactivitymediaevents" + unique_together = (("resourceactivityid", "mediaid"),) class Resourcealtindigenousname(models.Model): - altindigenousnameid = models.IntegerField(db_column='AltIndigenousNameID', primary_key=True) # Field name made lowercase. - resourceid = models.IntegerField(db_column='ResourceID', blank=True, null=True) # Field name made lowercase. - altindigenousname = models.CharField(db_column='AltIndigenousName', max_length=255, blank=True, null=True) # Field name made lowercase. + altindigenousnameid = models.IntegerField( + db_column="AltIndigenousNameID", primary_key=True + ) # Field name made lowercase. + resourceid = models.IntegerField( + db_column="ResourceID", blank=True, null=True + ) # Field name made lowercase. + altindigenousname = models.CharField( + db_column="AltIndigenousName", max_length=255, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'resourcealtindigenousname' + db_table = "resourcealtindigenousname" class Resourceresourceevents(models.Model): - resourceid = models.IntegerField(db_column='ResourceID') # Field name made lowercase. - altresourceid = models.IntegerField(db_column='AltResourceID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + resourceid = models.IntegerField( + db_column="ResourceID" + ) # Field name made lowercase. + altresourceid = models.IntegerField( + db_column="AltResourceID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'resourceresourceevents' - unique_together = (('resourceid', 'altresourceid'),) + db_table = "resourceresourceevents" + unique_together = (("resourceid", "altresourceid"),) class Resources(models.Model): - resourceid = models.IntegerField(db_column='ResourceID', primary_key=True) # Field name made lowercase. - commonname = models.CharField(db_column='CommonName', max_length=255, blank=True, null=True) # Field name made lowercase. - indigenousname = models.CharField(db_column='IndigenousName', max_length=255, blank=True, null=True) # Field name made lowercase. - genus = models.CharField(db_column='Genus', max_length=255, blank=True, null=True) # Field name made lowercase. - species = models.CharField(db_column='Species', max_length=255, blank=True, null=True) # Field name made lowercase. - specific = models.IntegerField(db_column='Specific') # Field name made lowercase. - resourceclassificationgroup = models.CharField(db_column='ResourceClassificationGroup', max_length=255, blank=True, null=True) # Field name made lowercase. - islocked = models.IntegerField(db_column='IsLocked') # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + resourceid = models.IntegerField( + db_column="ResourceID", primary_key=True + ) # Field name made lowercase. + commonname = models.CharField( + db_column="CommonName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + indigenousname = models.CharField( + db_column="IndigenousName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + genus = models.CharField( + db_column="Genus", max_length=255, blank=True, null=True + ) # Field name made lowercase. + species = models.CharField( + db_column="Species", max_length=255, blank=True, null=True + ) # Field name made lowercase. + specific = models.IntegerField(db_column="Specific") # Field name made lowercase. + resourceclassificationgroup = models.CharField( + db_column="ResourceClassificationGroup", max_length=255, blank=True, null=True + ) # Field name made lowercase. + islocked = models.IntegerField(db_column="IsLocked") # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'resources' + db_table = "resources" class Resourcesactivityevents(models.Model): - resourceactivityid = models.IntegerField(db_column='ResourceActivityID', primary_key=True) # Field name made lowercase. - placeresourceid = models.ForeignKey(Placesresourceevents, db_column='PlaceResourceID', blank=True, null=True) # Field name made lowercase. - relationshipdescription = models.TextField(db_column='RelationshipDescription', blank=True, null=True) # Field name made lowercase. - partused = models.CharField(db_column='PartUsed', max_length=255, blank=True, null=True) # Field name made lowercase. - activityshortdescription = models.CharField(db_column='ActivityShortDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - activitylongdescription = models.TextField(db_column='ActivityLongDescription', blank=True, null=True) # Field name made lowercase. - participants = models.CharField(db_column='Participants', max_length=50, blank=True, null=True) # Field name made lowercase. - technique = models.CharField(db_column='Technique', max_length=255, blank=True, null=True) # Field name made lowercase. - gear = models.CharField(db_column='Gear', max_length=255, blank=True, null=True) # Field name made lowercase. - customaryuse = models.CharField(db_column='CustomaryUse', max_length=255, blank=True, null=True) # Field name made lowercase. - timing = models.CharField(db_column='Timing', max_length=255, blank=True, null=True) # Field name made lowercase. - timingdescription = models.CharField(db_column='TimingDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - islocked = models.IntegerField(db_column='IsLocked') # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. - - class Meta: - managed = False - db_table = 'resourcesactivityevents' + resourceactivityid = models.IntegerField( + db_column="ResourceActivityID", primary_key=True + ) # Field name made lowercase. + placeresourceid = models.ForeignKey( + Placesresourceevents, db_column="PlaceResourceID", blank=True, null=True + ) # Field name made lowercase. + relationshipdescription = models.TextField( + db_column="RelationshipDescription", blank=True, null=True + ) # Field name made lowercase. + partused = models.CharField( + db_column="PartUsed", max_length=255, blank=True, null=True + ) # Field name made lowercase. + activityshortdescription = models.CharField( + db_column="ActivityShortDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + activitylongdescription = models.TextField( + db_column="ActivityLongDescription", blank=True, null=True + ) # Field name made lowercase. + participants = models.CharField( + db_column="Participants", max_length=50, blank=True, null=True + ) # Field name made lowercase. + technique = models.CharField( + db_column="Technique", max_length=255, blank=True, null=True + ) # Field name made lowercase. + gear = models.CharField( + db_column="Gear", max_length=255, blank=True, null=True + ) # Field name made lowercase. + customaryuse = models.CharField( + db_column="CustomaryUse", max_length=255, blank=True, null=True + ) # Field name made lowercase. + timing = models.CharField( + db_column="Timing", max_length=255, blank=True, null=True + ) # Field name made lowercase. + timingdescription = models.CharField( + db_column="TimingDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + islocked = models.IntegerField(db_column="IsLocked") # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. + + class Meta: + managed = False + db_table = "resourcesactivityevents" class Resourcescitationevents(models.Model): - resourceid = models.ForeignKey(Resources, db_column='ResourceID') # Field name made lowercase. - citationid = models.ForeignKey(Citations, db_column='CitationID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=255, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + resourceid = models.ForeignKey( + Resources, db_column="ResourceID" + ) # Field name made lowercase. + citationid = models.ForeignKey( + Citations, db_column="CitationID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=255, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'resourcescitationevents' - unique_together = (('resourceid', 'citationid'),) + db_table = "resourcescitationevents" + unique_together = (("resourceid", "citationid"),) class Resourcesmediaevents(models.Model): - resourceid = models.ForeignKey(Resources, db_column='ResourceID') # Field name made lowercase. - mediaid = models.ForeignKey(Media, db_column='MediaID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=50, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + resourceid = models.ForeignKey( + Resources, db_column="ResourceID" + ) # Field name made lowercase. + mediaid = models.ForeignKey( + Media, db_column="MediaID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=50, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'resourcesmediaevents' - unique_together = (('resourceid', 'mediaid'),) + db_table = "resourcesmediaevents" + unique_together = (("resourceid", "mediaid"),) class Useraccess(models.Model): - accessid = models.IntegerField(db_column='AccessID', primary_key=True) # Field name made lowercase. - accesslevel = models.CharField(db_column='AccessLevel', max_length=255, blank=True, null=True) # Field name made lowercase. + accessid = models.IntegerField( + db_column="AccessID", primary_key=True + ) # Field name made lowercase. + accesslevel = models.CharField( + db_column="AccessLevel", max_length=255, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'useraccess' + db_table = "useraccess" class Users(models.Model): - userid = models.IntegerField(db_column='UserID', primary_key=True) # Field name made lowercase. - username = models.CharField(db_column='UserName', max_length=20, blank=True, null=True) # Field name made lowercase. - password = models.CharField(db_column='Password', max_length=20, blank=True, null=True) # Field name made lowercase. - firstname = models.CharField(db_column='FirstName', max_length=255, blank=True, null=True) # Field name made lowercase. - lastname = models.CharField(db_column='LastName', max_length=255, blank=True, null=True) # Field name made lowercase. - affiliation = models.CharField(db_column='Affiliation', max_length=255, blank=True, null=True) # Field name made lowercase. - title = models.CharField(db_column='Title', max_length=255, blank=True, null=True) # Field name made lowercase. - accesslevel = models.IntegerField(db_column='AccessLevel', blank=True, null=True) # Field name made lowercase. + userid = models.IntegerField( + db_column="UserID", primary_key=True + ) # Field name made lowercase. + username = models.CharField( + db_column="UserName", max_length=20, blank=True, null=True + ) # Field name made lowercase. + password = models.CharField( + db_column="Password", max_length=20, blank=True, null=True + ) # Field name made lowercase. + firstname = models.CharField( + db_column="FirstName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + lastname = models.CharField( + db_column="LastName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + affiliation = models.CharField( + db_column="Affiliation", max_length=255, blank=True, null=True + ) # Field name made lowercase. + title = models.CharField( + db_column="Title", max_length=255, blank=True, null=True + ) # Field name made lowercase. + accesslevel = models.IntegerField( + db_column="AccessLevel", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'users' + db_table = "users" diff --git a/docs/Data/models_old.py b/docs/Data/models_old.py index 4ff044cd..b1f4bd41 100644 --- a/docs/Data/models_old.py +++ b/docs/Data/models_old.py @@ -11,625 +11,1260 @@ class Citations(models.Model): - citationid = models.AutoField(db_column='CitationID', primary_key=True) # Field name made lowercase. - referencetype = models.CharField(db_column='ReferenceType', max_length=255, blank=True, null=True) # Field name made lowercase. - referencetext = models.CharField(db_column='ReferenceText', max_length=50, blank=True, null=True) # Field name made lowercase. - authortype = models.CharField(db_column='AuthorType', max_length=255, blank=True, null=True) # Field name made lowercase. - authorprimary = models.CharField(db_column='AuthorPrimary', max_length=255, blank=True, null=True) # Field name made lowercase. - authorsecondary = models.CharField(db_column='AuthorSecondary', max_length=255, blank=True, null=True) # Field name made lowercase. - intervieweeid = models.IntegerField(db_column='IntervieweeID', blank=True, null=True) # Field name made lowercase. - interviewerid = models.IntegerField(db_column='InterviewerID', blank=True, null=True) # Field name made lowercase. - placeofinterview = models.CharField(db_column='PlaceofInterview', max_length=255, blank=True, null=True) # Field name made lowercase. - year = models.IntegerField(db_column='Year', blank=True, null=True) # Field name made lowercase. - title = models.TextField(db_column='Title', blank=True, null=True) # Field name made lowercase. - seriestitle = models.CharField(db_column='SeriesTitle', max_length=255, blank=True, null=True) # Field name made lowercase. - seriesvolume = models.CharField(db_column='SeriesVolume', max_length=50, blank=True, null=True) # Field name made lowercase. - serieseditor = models.CharField(db_column='SeriesEditor', max_length=255, blank=True, null=True) # Field name made lowercase. - publisher = models.CharField(db_column='Publisher', max_length=100, blank=True, null=True) # Field name made lowercase. - publishercity = models.CharField(db_column='PublisherCity', max_length=255, blank=True, null=True) # Field name made lowercase. - preparedfor = models.CharField(db_column='PreparedFor', max_length=100, blank=True, null=True) # Field name made lowercase. - comments = models.TextField(db_column='Comments', blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. - - class Meta: - managed = False - db_table = 'Citations' + citationid = models.AutoField( + db_column="CitationID", primary_key=True + ) # Field name made lowercase. + referencetype = models.CharField( + db_column="ReferenceType", max_length=255, blank=True, null=True + ) # Field name made lowercase. + referencetext = models.CharField( + db_column="ReferenceText", max_length=50, blank=True, null=True + ) # Field name made lowercase. + authortype = models.CharField( + db_column="AuthorType", max_length=255, blank=True, null=True + ) # Field name made lowercase. + authorprimary = models.CharField( + db_column="AuthorPrimary", max_length=255, blank=True, null=True + ) # Field name made lowercase. + authorsecondary = models.CharField( + db_column="AuthorSecondary", max_length=255, blank=True, null=True + ) # Field name made lowercase. + intervieweeid = models.IntegerField( + db_column="IntervieweeID", blank=True, null=True + ) # Field name made lowercase. + interviewerid = models.IntegerField( + db_column="InterviewerID", blank=True, null=True + ) # Field name made lowercase. + placeofinterview = models.CharField( + db_column="PlaceofInterview", max_length=255, blank=True, null=True + ) # Field name made lowercase. + year = models.IntegerField( + db_column="Year", blank=True, null=True + ) # Field name made lowercase. + title = models.TextField( + db_column="Title", blank=True, null=True + ) # Field name made lowercase. + seriestitle = models.CharField( + db_column="SeriesTitle", max_length=255, blank=True, null=True + ) # Field name made lowercase. + seriesvolume = models.CharField( + db_column="SeriesVolume", max_length=50, blank=True, null=True + ) # Field name made lowercase. + serieseditor = models.CharField( + db_column="SeriesEditor", max_length=255, blank=True, null=True + ) # Field name made lowercase. + publisher = models.CharField( + db_column="Publisher", max_length=100, blank=True, null=True + ) # Field name made lowercase. + publishercity = models.CharField( + db_column="PublisherCity", max_length=255, blank=True, null=True + ) # Field name made lowercase. + preparedfor = models.CharField( + db_column="PreparedFor", max_length=100, blank=True, null=True + ) # Field name made lowercase. + comments = models.TextField( + db_column="Comments", blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. + + class Meta: + managed = False + db_table = "Citations" class Currentversion(models.Model): - id = models.AutoField(db_column='ID', primary_key=True) # Field name made lowercase. - backendversion = models.IntegerField(db_column='BackendVersion', blank=True, null=True) # Field name made lowercase. - frontendversion = models.IntegerField(db_column='FrontendVersion', blank=True, null=True) # Field name made lowercase. + id = models.AutoField( + db_column="ID", primary_key=True + ) # Field name made lowercase. + backendversion = models.IntegerField( + db_column="BackendVersion", blank=True, null=True + ) # Field name made lowercase. + frontendversion = models.IntegerField( + db_column="FrontendVersion", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'CurrentVersion' + db_table = "CurrentVersion" class Locality(models.Model): - localityid = models.AutoField(db_column='LocalityID', primary_key=True) # Field name made lowercase. - placeid = models.ForeignKey('Places', models.DO_NOTHING, db_column='PlaceID', blank=True, null=True) # Field name made lowercase. - englishname = models.CharField(db_column='EnglishName', max_length=255, blank=True, null=True) # Field name made lowercase. - indigenousname = models.CharField(db_column='IndigenousName', max_length=255, blank=True, null=True) # Field name made lowercase. - localitytype = models.CharField(db_column='LocalityType', max_length=255, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + localityid = models.AutoField( + db_column="LocalityID", primary_key=True + ) # Field name made lowercase. + placeid = models.ForeignKey( + "Places", models.DO_NOTHING, db_column="PlaceID", blank=True, null=True + ) # Field name made lowercase. + englishname = models.CharField( + db_column="EnglishName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + indigenousname = models.CharField( + db_column="IndigenousName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + localitytype = models.CharField( + db_column="LocalityType", max_length=255, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'Locality' + db_table = "Locality" class Localitygisselections(models.Model): - localityid = models.IntegerField(db_column='LocalityID', blank=True, null=True) # Field name made lowercase. - localitylabel = models.CharField(db_column='LocalityLabel', max_length=255, blank=True, null=True) # Field name made lowercase. - sourcefc = models.CharField(db_column='SourceFC', max_length=255, blank=True, null=True) # Field name made lowercase. + localityid = models.IntegerField( + db_column="LocalityID", blank=True, null=True + ) # Field name made lowercase. + localitylabel = models.CharField( + db_column="LocalityLabel", max_length=255, blank=True, null=True + ) # Field name made lowercase. + sourcefc = models.CharField( + db_column="SourceFC", max_length=255, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LocalityGISSelections' + db_table = "LocalityGISSelections" class Localityplaceresourceevent(models.Model): - placeresourceid = models.ForeignKey('Placesresourceevents', models.DO_NOTHING, db_column='PlaceResourceID', primary_key=True) # Field name made lowercase. - localityid = models.ForeignKey(Locality, models.DO_NOTHING, db_column='LocalityID') # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + placeresourceid = models.ForeignKey( + "Placesresourceevents", + models.DO_NOTHING, + db_column="PlaceResourceID", + primary_key=True, + ) # Field name made lowercase. + localityid = models.ForeignKey( + Locality, models.DO_NOTHING, db_column="LocalityID" + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LocalityPlaceResourceEvent' - unique_together = (('placeresourceid', 'localityid'),) + db_table = "LocalityPlaceResourceEvent" + unique_together = (("placeresourceid", "localityid"),) class Lookupactivity(models.Model): - activity = models.CharField(db_column='Activity', primary_key=True, max_length=255) # Field name made lowercase. + activity = models.CharField( + db_column="Activity", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LookupActivity' + db_table = "LookupActivity" class Lookupauthortype(models.Model): - authortype = models.CharField(db_column='AuthorType', primary_key=True, max_length=50) # Field name made lowercase. + authortype = models.CharField( + db_column="AuthorType", primary_key=True, max_length=50 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LookupAuthorType' + db_table = "LookupAuthorType" class Lookupcustomaryuse(models.Model): - usedfor = models.CharField(db_column='UsedFor', primary_key=True, max_length=255) # Field name made lowercase. + usedfor = models.CharField( + db_column="UsedFor", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LookupCustomaryUse' + db_table = "LookupCustomaryUse" class Lookuphabitat(models.Model): - habitat = models.CharField(db_column='Habitat', primary_key=True, max_length=100) # Field name made lowercase. + habitat = models.CharField( + db_column="Habitat", primary_key=True, max_length=100 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LookupHabitat' + db_table = "LookupHabitat" class Lookuplocalitytype(models.Model): - localitytype = models.CharField(db_column='LocalityType', primary_key=True, max_length=255) # Field name made lowercase. + localitytype = models.CharField( + db_column="LocalityType", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LookupLocalityType' + db_table = "LookupLocalityType" class Lookupmediatype(models.Model): - mediatype = models.CharField(db_column='MediaType', primary_key=True, max_length=255) # Field name made lowercase. - mediacategory = models.CharField(db_column='MediaCategory', max_length=255, blank=True, null=True) # Field name made lowercase. + mediatype = models.CharField( + db_column="MediaType", primary_key=True, max_length=255 + ) # Field name made lowercase. + mediacategory = models.CharField( + db_column="MediaCategory", max_length=255, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LookupMediaType' + db_table = "LookupMediaType" class Lookuppartused(models.Model): - partused = models.CharField(db_column='PartUsed', primary_key=True, max_length=255) # Field name made lowercase. + partused = models.CharField( + db_column="PartUsed", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LookupPartUsed' + db_table = "LookupPartUsed" class Lookupparticipants(models.Model): - participants = models.CharField(db_column='Participants', primary_key=True, max_length=255) # Field name made lowercase. + participants = models.CharField( + db_column="Participants", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LookupParticipants' + db_table = "LookupParticipants" class Lookupplanningunit(models.Model): - planningunitid = models.IntegerField(db_column='PlanningUnitID', primary_key=True) # Field name made lowercase. - planningunitname = models.CharField(db_column='PlanningUnitName', max_length=100, blank=True, null=True) # Field name made lowercase. + planningunitid = models.IntegerField( + db_column="PlanningUnitID", primary_key=True + ) # Field name made lowercase. + planningunitname = models.CharField( + db_column="PlanningUnitName", max_length=100, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LookupPlanningUnit' + db_table = "LookupPlanningUnit" class Lookupreferencetype(models.Model): - documenttype = models.CharField(db_column='DocumentType', primary_key=True, max_length=25) # Field name made lowercase. + documenttype = models.CharField( + db_column="DocumentType", primary_key=True, max_length=25 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LookupReferenceType' + db_table = "LookupReferenceType" class Lookupresourcegroup(models.Model): - resourceclassificationgroup = models.CharField(db_column='ResourceClassificationGroup', primary_key=True, max_length=255) # Field name made lowercase. + resourceclassificationgroup = models.CharField( + db_column="ResourceClassificationGroup", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LookupResourceGroup' + db_table = "LookupResourceGroup" class Lookupseason(models.Model): - season = models.CharField(db_column='Season', primary_key=True, max_length=255) # Field name made lowercase. + season = models.CharField( + db_column="Season", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LookupSeason' + db_table = "LookupSeason" class Lookuptechniques(models.Model): - techniques = models.CharField(db_column='Techniques', primary_key=True, max_length=255) # Field name made lowercase. + techniques = models.CharField( + db_column="Techniques", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LookupTechniques' + db_table = "LookupTechniques" class Lookuptiming(models.Model): - timing = models.CharField(db_column='Timing', primary_key=True, max_length=255) # Field name made lowercase. + timing = models.CharField( + db_column="Timing", primary_key=True, max_length=255 + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LookupTiming' + db_table = "LookupTiming" class Lookuptribe(models.Model): - id = models.AutoField(db_column='ID', primary_key=True) # Field name made lowercase. - tribeunit = models.CharField(db_column='TribeUnit', max_length=50, blank=True, null=True) # Field name made lowercase. - tribe = models.CharField(db_column='Tribe', max_length=100, blank=True, null=True) # Field name made lowercase. - federaltribe = models.CharField(db_column='FederalTribe', max_length=100, blank=True, null=True) # Field name made lowercase. + id = models.AutoField( + db_column="ID", primary_key=True + ) # Field name made lowercase. + tribeunit = models.CharField( + db_column="TribeUnit", max_length=50, blank=True, null=True + ) # Field name made lowercase. + tribe = models.CharField( + db_column="Tribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + federaltribe = models.CharField( + db_column="FederalTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LookupTribe' + db_table = "LookupTribe" class Lookupuserinfo(models.Model): - username = models.CharField(db_column='UserName', max_length=100, blank=True, null=True) # Field name made lowercase. - usingcustomusername = models.NullBooleanField(db_column='UsingCustomUsername') # Field name made lowercase. - usertitle = models.CharField(db_column='UserTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - useraffiliation = models.CharField(db_column='UserAffiliation', max_length=100, blank=True, null=True) # Field name made lowercase. + username = models.CharField( + db_column="UserName", max_length=100, blank=True, null=True + ) # Field name made lowercase. + usingcustomusername = models.NullBooleanField( + db_column="UsingCustomUsername" + ) # Field name made lowercase. + usertitle = models.CharField( + db_column="UserTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + useraffiliation = models.CharField( + db_column="UserAffiliation", max_length=100, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'LookupUserInfo' + db_table = "LookupUserInfo" class Media(models.Model): - mediaid = models.AutoField(db_column='MediaID', primary_key=True) # Field name made lowercase. - mediatype = models.CharField(db_column='MediaType', max_length=255, blank=True, null=True) # Field name made lowercase. - medianame = models.CharField(db_column='MediaName', max_length=255, blank=True, null=True) # Field name made lowercase. - mediadescription = models.TextField(db_column='MediaDescription', blank=True, null=True) # Field name made lowercase. - medialink = models.CharField(db_column='MediaLink', max_length=255, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + mediaid = models.AutoField( + db_column="MediaID", primary_key=True + ) # Field name made lowercase. + mediatype = models.CharField( + db_column="MediaType", max_length=255, blank=True, null=True + ) # Field name made lowercase. + medianame = models.CharField( + db_column="MediaName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + mediadescription = models.TextField( + db_column="MediaDescription", blank=True, null=True + ) # Field name made lowercase. + medialink = models.CharField( + db_column="MediaLink", max_length=255, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'Media' + db_table = "Media" class Mediacitationevents(models.Model): - mediaid = models.ForeignKey(Media, models.DO_NOTHING, db_column='MediaID', primary_key=True) # Field name made lowercase. - citationid = models.ForeignKey(Citations, models.DO_NOTHING, db_column='CitationID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=255, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + mediaid = models.ForeignKey( + Media, models.DO_NOTHING, db_column="MediaID", primary_key=True + ) # Field name made lowercase. + citationid = models.ForeignKey( + Citations, models.DO_NOTHING, db_column="CitationID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=255, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'MediaCitationEvents' - unique_together = (('mediaid', 'citationid'),) + db_table = "MediaCitationEvents" + unique_together = (("mediaid", "citationid"),) class People(models.Model): - personid = models.AutoField(db_column='PersonID', primary_key=True) # Field name made lowercase. - firstname = models.CharField(db_column='FirstName', max_length=255, blank=True, null=True) # Field name made lowercase. - lastname = models.CharField(db_column='LastName', max_length=255, blank=True, null=True) # Field name made lowercase. - yearborn = models.IntegerField(db_column='YearBorn', blank=True, null=True) # Field name made lowercase. - village = models.CharField(db_column='Village', max_length=255, blank=True, null=True) # Field name made lowercase. - relationshiptootherpeople = models.TextField(db_column='RelationshipToOtherPeople', blank=True, null=True) # Field name made lowercase. + personid = models.AutoField( + db_column="PersonID", primary_key=True + ) # Field name made lowercase. + firstname = models.CharField( + db_column="FirstName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + lastname = models.CharField( + db_column="LastName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + yearborn = models.IntegerField( + db_column="YearBorn", blank=True, null=True + ) # Field name made lowercase. + village = models.CharField( + db_column="Village", max_length=255, blank=True, null=True + ) # Field name made lowercase. + relationshiptootherpeople = models.TextField( + db_column="RelationshipToOtherPeople", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'People' + db_table = "People" class Placealtindigenousname(models.Model): - altindigenousnameid = models.AutoField(db_column='AltIndigenousNameID', primary_key=True) # Field name made lowercase. - placeid = models.IntegerField(db_column='PlaceID', blank=True, null=True) # Field name made lowercase. - altindigenousname = models.CharField(db_column='AltIndigenousName', max_length=255, blank=True, null=True) # Field name made lowercase. + altindigenousnameid = models.AutoField( + db_column="AltIndigenousNameID", primary_key=True + ) # Field name made lowercase. + placeid = models.IntegerField( + db_column="PlaceID", blank=True, null=True + ) # Field name made lowercase. + altindigenousname = models.CharField( + db_column="AltIndigenousName", max_length=255, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'PlaceAltIndigenousName' + db_table = "PlaceAltIndigenousName" class Placegisselections(models.Model): - placeid = models.IntegerField(db_column='PlaceID', blank=True, null=True) # Field name made lowercase. - placelabel = models.CharField(db_column='PlaceLabel', max_length=255, blank=True, null=True) # Field name made lowercase. - sourcefc = models.CharField(db_column='SourceFC', max_length=255, blank=True, null=True) # Field name made lowercase. + placeid = models.IntegerField( + db_column="PlaceID", blank=True, null=True + ) # Field name made lowercase. + placelabel = models.CharField( + db_column="PlaceLabel", max_length=255, blank=True, null=True + ) # Field name made lowercase. + sourcefc = models.CharField( + db_column="SourceFC", max_length=255, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'PlaceGISSelections' + db_table = "PlaceGISSelections" class Places(models.Model): - placeid = models.AutoField(db_column='PlaceID', primary_key=True) # Field name made lowercase. - indigenousplacename = models.CharField(db_column='IndigenousPlaceName', max_length=255, blank=True, null=True) # Field name made lowercase. - indigenousplacenamemeaning = models.CharField(db_column='IndigenousPlaceNameMeaning', max_length=255, blank=True, null=True) # Field name made lowercase. - englishplacename = models.CharField(db_column='EnglishPlaceName', max_length=255, blank=True, null=True) # Field name made lowercase. - planningunitid = models.IntegerField(db_column='PlanningUnitID', blank=True, null=True) # Field name made lowercase. - primaryhabitat = models.CharField(db_column='PrimaryHabitat', max_length=100, blank=True, null=True) # Field name made lowercase. - tribeid = models.IntegerField(db_column='TribeID', blank=True, null=True) # Field name made lowercase. - islocked = models.NullBooleanField(db_column='IsLocked') # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + placeid = models.AutoField( + db_column="PlaceID", primary_key=True + ) # Field name made lowercase. + indigenousplacename = models.CharField( + db_column="IndigenousPlaceName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + indigenousplacenamemeaning = models.CharField( + db_column="IndigenousPlaceNameMeaning", max_length=255, blank=True, null=True + ) # Field name made lowercase. + englishplacename = models.CharField( + db_column="EnglishPlaceName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + planningunitid = models.IntegerField( + db_column="PlanningUnitID", blank=True, null=True + ) # Field name made lowercase. + primaryhabitat = models.CharField( + db_column="PrimaryHabitat", max_length=100, blank=True, null=True + ) # Field name made lowercase. + tribeid = models.IntegerField( + db_column="TribeID", blank=True, null=True + ) # Field name made lowercase. + islocked = models.NullBooleanField( + db_column="IsLocked" + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'Places' + db_table = "Places" class Placescitationevents(models.Model): - placeid = models.ForeignKey(Places, models.DO_NOTHING, db_column='PlaceID', primary_key=True) # Field name made lowercase. - citationid = models.IntegerField(db_column='CitationID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=255, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + placeid = models.ForeignKey( + Places, models.DO_NOTHING, db_column="PlaceID", primary_key=True + ) # Field name made lowercase. + citationid = models.IntegerField( + db_column="CitationID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=255, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'PlacesCitationEvents' - unique_together = (('placeid', 'citationid'),) + db_table = "PlacesCitationEvents" + unique_together = (("placeid", "citationid"),) class Placesmediaevents(models.Model): - placeid = models.ForeignKey(Places, models.DO_NOTHING, db_column='PlaceID', primary_key=True) # Field name made lowercase. - mediaid = models.ForeignKey(Media, models.DO_NOTHING, db_column='MediaID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=50, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + placeid = models.ForeignKey( + Places, models.DO_NOTHING, db_column="PlaceID", primary_key=True + ) # Field name made lowercase. + mediaid = models.ForeignKey( + Media, models.DO_NOTHING, db_column="MediaID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=50, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'PlacesMediaEvents' - unique_together = (('placeid', 'mediaid'),) + db_table = "PlacesMediaEvents" + unique_together = (("placeid", "mediaid"),) class Placesresourcecitationevents(models.Model): - placeresourceid = models.ForeignKey('Placesresourceevents', models.DO_NOTHING, db_column='PlaceResourceID', primary_key=True) # Field name made lowercase. - citationid = models.IntegerField(db_column='CitationID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=255, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + placeresourceid = models.ForeignKey( + "Placesresourceevents", + models.DO_NOTHING, + db_column="PlaceResourceID", + primary_key=True, + ) # Field name made lowercase. + citationid = models.IntegerField( + db_column="CitationID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=255, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'PlacesResourceCitationEvents' - unique_together = (('placeresourceid', 'citationid'),) + db_table = "PlacesResourceCitationEvents" + unique_together = (("placeresourceid", "citationid"),) class Placesresourceevents(models.Model): - placeresourceid = models.AutoField(db_column='PlaceResourceID', primary_key=True) # Field name made lowercase. - placeid = models.ForeignKey(Places, models.DO_NOTHING, db_column='PlaceID') # Field name made lowercase. - resourceid = models.IntegerField(db_column='ResourceID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - partused = models.CharField(db_column='PartUsed', max_length=255, blank=True, null=True) # Field name made lowercase. - customaryuse = models.CharField(db_column='CustomaryUse', max_length=255, blank=True, null=True) # Field name made lowercase. - barterresource = models.NullBooleanField(db_column='BarterResource') # Field name made lowercase. - season = models.CharField(db_column='Season', max_length=255, blank=True, null=True) # Field name made lowercase. - timing = models.CharField(db_column='Timing', max_length=255, blank=True, null=True) # Field name made lowercase. - january = models.NullBooleanField(db_column='January') # Field name made lowercase. - february = models.NullBooleanField(db_column='February') # Field name made lowercase. - march = models.NullBooleanField(db_column='March') # Field name made lowercase. - april = models.NullBooleanField(db_column='April') # Field name made lowercase. - may = models.NullBooleanField(db_column='May') # Field name made lowercase. - june = models.NullBooleanField(db_column='June') # Field name made lowercase. - july = models.NullBooleanField(db_column='July') # Field name made lowercase. - august = models.NullBooleanField(db_column='August') # Field name made lowercase. - september = models.NullBooleanField(db_column='September') # Field name made lowercase. - october = models.NullBooleanField(db_column='October') # Field name made lowercase. - november = models.NullBooleanField(db_column='November') # Field name made lowercase. - december = models.NullBooleanField(db_column='December') # Field name made lowercase. - year = models.IntegerField(db_column='Year', blank=True, null=True) # Field name made lowercase. - islocked = models.NullBooleanField(db_column='IsLocked') # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. - - class Meta: - managed = False - db_table = 'PlacesResourceEvents' + placeresourceid = models.AutoField( + db_column="PlaceResourceID", primary_key=True + ) # Field name made lowercase. + placeid = models.ForeignKey( + Places, models.DO_NOTHING, db_column="PlaceID" + ) # Field name made lowercase. + resourceid = models.IntegerField( + db_column="ResourceID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + partused = models.CharField( + db_column="PartUsed", max_length=255, blank=True, null=True + ) # Field name made lowercase. + customaryuse = models.CharField( + db_column="CustomaryUse", max_length=255, blank=True, null=True + ) # Field name made lowercase. + barterresource = models.NullBooleanField( + db_column="BarterResource" + ) # Field name made lowercase. + season = models.CharField( + db_column="Season", max_length=255, blank=True, null=True + ) # Field name made lowercase. + timing = models.CharField( + db_column="Timing", max_length=255, blank=True, null=True + ) # Field name made lowercase. + january = models.NullBooleanField(db_column="January") # Field name made lowercase. + february = models.NullBooleanField( + db_column="February" + ) # Field name made lowercase. + march = models.NullBooleanField(db_column="March") # Field name made lowercase. + april = models.NullBooleanField(db_column="April") # Field name made lowercase. + may = models.NullBooleanField(db_column="May") # Field name made lowercase. + june = models.NullBooleanField(db_column="June") # Field name made lowercase. + july = models.NullBooleanField(db_column="July") # Field name made lowercase. + august = models.NullBooleanField(db_column="August") # Field name made lowercase. + september = models.NullBooleanField( + db_column="September" + ) # Field name made lowercase. + october = models.NullBooleanField(db_column="October") # Field name made lowercase. + november = models.NullBooleanField( + db_column="November" + ) # Field name made lowercase. + december = models.NullBooleanField( + db_column="December" + ) # Field name made lowercase. + year = models.IntegerField( + db_column="Year", blank=True, null=True + ) # Field name made lowercase. + islocked = models.NullBooleanField( + db_column="IsLocked" + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. + + class Meta: + managed = False + db_table = "PlacesResourceEvents" class Placesresourcemediaevents(models.Model): - placeresourceid = models.ForeignKey(Placesresourceevents, models.DO_NOTHING, db_column='PlaceResourceID', primary_key=True) # Field name made lowercase. - mediaid = models.IntegerField(db_column='MediaID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=50, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + placeresourceid = models.ForeignKey( + Placesresourceevents, + models.DO_NOTHING, + db_column="PlaceResourceID", + primary_key=True, + ) # Field name made lowercase. + mediaid = models.IntegerField(db_column="MediaID") # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=50, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'PlacesResourceMediaEvents' - unique_together = (('placeresourceid', 'mediaid'),) + db_table = "PlacesResourceMediaEvents" + unique_together = (("placeresourceid", "mediaid"),) class Resourceactivitycitationevents(models.Model): - resourceactivityid = models.ForeignKey('Resourcesactivityevents', models.DO_NOTHING, db_column='ResourceActivityID', primary_key=True) # Field name made lowercase. - citationid = models.IntegerField(db_column='CitationID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=255, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + resourceactivityid = models.ForeignKey( + "Resourcesactivityevents", + models.DO_NOTHING, + db_column="ResourceActivityID", + primary_key=True, + ) # Field name made lowercase. + citationid = models.IntegerField( + db_column="CitationID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=255, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'ResourceActivityCitationEvents' - unique_together = (('resourceactivityid', 'citationid'),) + db_table = "ResourceActivityCitationEvents" + unique_together = (("resourceactivityid", "citationid"),) class Resourceactivitymediaevents(models.Model): - resourceactivityid = models.ForeignKey('Resourcesactivityevents', models.DO_NOTHING, db_column='ResourceActivityID', primary_key=True) # Field name made lowercase. - mediaid = models.IntegerField(db_column='MediaID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=50, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + resourceactivityid = models.ForeignKey( + "Resourcesactivityevents", + models.DO_NOTHING, + db_column="ResourceActivityID", + primary_key=True, + ) # Field name made lowercase. + mediaid = models.IntegerField(db_column="MediaID") # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=50, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'ResourceActivityMediaEvents' - unique_together = (('resourceactivityid', 'mediaid'),) + db_table = "ResourceActivityMediaEvents" + unique_together = (("resourceactivityid", "mediaid"),) class Resourcealtindigenousname(models.Model): - altindigenousnameid = models.AutoField(db_column='AltIndigenousNameID', primary_key=True) # Field name made lowercase. - resourceid = models.IntegerField(db_column='ResourceID', blank=True, null=True) # Field name made lowercase. - altindigenousname = models.CharField(db_column='AltIndigenousName', max_length=255, blank=True, null=True) # Field name made lowercase. + altindigenousnameid = models.AutoField( + db_column="AltIndigenousNameID", primary_key=True + ) # Field name made lowercase. + resourceid = models.IntegerField( + db_column="ResourceID", blank=True, null=True + ) # Field name made lowercase. + altindigenousname = models.CharField( + db_column="AltIndigenousName", max_length=255, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'ResourceAltIndigenousName' + db_table = "ResourceAltIndigenousName" class Resourceresourceevents(models.Model): - resourceid = models.IntegerField(db_column='ResourceID', primary_key=True) # Field name made lowercase. - altresourceid = models.IntegerField(db_column='AltResourceID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + resourceid = models.IntegerField( + db_column="ResourceID", primary_key=True + ) # Field name made lowercase. + altresourceid = models.IntegerField( + db_column="AltResourceID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'ResourceResourceEvents' - unique_together = (('resourceid', 'altresourceid'),) + db_table = "ResourceResourceEvents" + unique_together = (("resourceid", "altresourceid"),) class Resources(models.Model): - resourceid = models.AutoField(db_column='ResourceID', primary_key=True) # Field name made lowercase. - commonname = models.CharField(db_column='CommonName', max_length=255, blank=True, null=True) # Field name made lowercase. - indigenousname = models.CharField(db_column='IndigenousName', max_length=255, blank=True, null=True) # Field name made lowercase. - genus = models.CharField(db_column='Genus', max_length=255, blank=True, null=True) # Field name made lowercase. - species = models.CharField(db_column='Species', max_length=255, blank=True, null=True) # Field name made lowercase. - specific = models.NullBooleanField(db_column='Specific') # Field name made lowercase. - resourceclassificationgroup = models.CharField(db_column='ResourceClassificationGroup', max_length=255, blank=True, null=True) # Field name made lowercase. - islocked = models.NullBooleanField(db_column='IsLocked') # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + resourceid = models.AutoField( + db_column="ResourceID", primary_key=True + ) # Field name made lowercase. + commonname = models.CharField( + db_column="CommonName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + indigenousname = models.CharField( + db_column="IndigenousName", max_length=255, blank=True, null=True + ) # Field name made lowercase. + genus = models.CharField( + db_column="Genus", max_length=255, blank=True, null=True + ) # Field name made lowercase. + species = models.CharField( + db_column="Species", max_length=255, blank=True, null=True + ) # Field name made lowercase. + specific = models.NullBooleanField( + db_column="Specific" + ) # Field name made lowercase. + resourceclassificationgroup = models.CharField( + db_column="ResourceClassificationGroup", max_length=255, blank=True, null=True + ) # Field name made lowercase. + islocked = models.NullBooleanField( + db_column="IsLocked" + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'Resources' + db_table = "Resources" class Resourcesactivityevents(models.Model): - resourceactivityid = models.AutoField(db_column='ResourceActivityID', primary_key=True) # Field name made lowercase. - placeresourceid = models.ForeignKey(Placesresourceevents, models.DO_NOTHING, db_column='PlaceResourceID') # Field name made lowercase. - relationshipdescription = models.TextField(db_column='RelationshipDescription', blank=True, null=True) # Field name made lowercase. - partused = models.CharField(db_column='PartUsed', max_length=255, blank=True, null=True) # Field name made lowercase. - activityshortdescription = models.CharField(db_column='ActivityShortDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - activitylongdescription = models.TextField(db_column='ActivityLongDescription', blank=True, null=True) # Field name made lowercase. - participants = models.CharField(db_column='Participants', max_length=50, blank=True, null=True) # Field name made lowercase. - technique = models.CharField(db_column='Technique', max_length=255, blank=True, null=True) # Field name made lowercase. - gear = models.CharField(db_column='Gear', max_length=255, blank=True, null=True) # Field name made lowercase. - customaryuse = models.CharField(db_column='CustomaryUse', max_length=255, blank=True, null=True) # Field name made lowercase. - timing = models.CharField(db_column='Timing', max_length=255, blank=True, null=True) # Field name made lowercase. - timingdescription = models.CharField(db_column='TimingDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - islocked = models.NullBooleanField(db_column='IsLocked') # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. - - class Meta: - managed = False - db_table = 'ResourcesActivityEvents' + resourceactivityid = models.AutoField( + db_column="ResourceActivityID", primary_key=True + ) # Field name made lowercase. + placeresourceid = models.ForeignKey( + Placesresourceevents, models.DO_NOTHING, db_column="PlaceResourceID" + ) # Field name made lowercase. + relationshipdescription = models.TextField( + db_column="RelationshipDescription", blank=True, null=True + ) # Field name made lowercase. + partused = models.CharField( + db_column="PartUsed", max_length=255, blank=True, null=True + ) # Field name made lowercase. + activityshortdescription = models.CharField( + db_column="ActivityShortDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + activitylongdescription = models.TextField( + db_column="ActivityLongDescription", blank=True, null=True + ) # Field name made lowercase. + participants = models.CharField( + db_column="Participants", max_length=50, blank=True, null=True + ) # Field name made lowercase. + technique = models.CharField( + db_column="Technique", max_length=255, blank=True, null=True + ) # Field name made lowercase. + gear = models.CharField( + db_column="Gear", max_length=255, blank=True, null=True + ) # Field name made lowercase. + customaryuse = models.CharField( + db_column="CustomaryUse", max_length=255, blank=True, null=True + ) # Field name made lowercase. + timing = models.CharField( + db_column="Timing", max_length=255, blank=True, null=True + ) # Field name made lowercase. + timingdescription = models.CharField( + db_column="TimingDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + islocked = models.NullBooleanField( + db_column="IsLocked" + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. + + class Meta: + managed = False + db_table = "ResourcesActivityEvents" class Resourcescitationevents(models.Model): - resourceid = models.ForeignKey(Resources, models.DO_NOTHING, db_column='ResourceID', primary_key=True) # Field name made lowercase. - citationid = models.ForeignKey(Citations, models.DO_NOTHING, db_column='CitationID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=255, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + resourceid = models.ForeignKey( + Resources, models.DO_NOTHING, db_column="ResourceID", primary_key=True + ) # Field name made lowercase. + citationid = models.ForeignKey( + Citations, models.DO_NOTHING, db_column="CitationID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=255, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'ResourcesCitationEvents' - unique_together = (('resourceid', 'citationid'),) + db_table = "ResourcesCitationEvents" + unique_together = (("resourceid", "citationid"),) class Resourcesmediaevents(models.Model): - resourceid = models.ForeignKey(Resources, models.DO_NOTHING, db_column='ResourceID', primary_key=True) # Field name made lowercase. - mediaid = models.ForeignKey(Media, models.DO_NOTHING, db_column='MediaID') # Field name made lowercase. - relationshipdescription = models.CharField(db_column='RelationshipDescription', max_length=255, blank=True, null=True) # Field name made lowercase. - pages = models.CharField(db_column='Pages', max_length=50, blank=True, null=True) # Field name made lowercase. - enteredbyname = models.CharField(db_column='EnteredByName', max_length=25, blank=True, null=True) # Field name made lowercase. - enteredbytribe = models.CharField(db_column='EnteredByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbytitle = models.CharField(db_column='EnteredByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - enteredbydate = models.DateTimeField(db_column='EnteredByDate', blank=True, null=True) # Field name made lowercase. - modifiedbyname = models.CharField(db_column='ModifiedByName', max_length=25, blank=True, null=True) # Field name made lowercase. - modifiedbytitle = models.CharField(db_column='ModifiedByTitle', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbytribe = models.CharField(db_column='ModifiedByTribe', max_length=100, blank=True, null=True) # Field name made lowercase. - modifiedbydate = models.DateTimeField(db_column='ModifiedByDate', blank=True, null=True) # Field name made lowercase. + resourceid = models.ForeignKey( + Resources, models.DO_NOTHING, db_column="ResourceID", primary_key=True + ) # Field name made lowercase. + mediaid = models.ForeignKey( + Media, models.DO_NOTHING, db_column="MediaID" + ) # Field name made lowercase. + relationshipdescription = models.CharField( + db_column="RelationshipDescription", max_length=255, blank=True, null=True + ) # Field name made lowercase. + pages = models.CharField( + db_column="Pages", max_length=50, blank=True, null=True + ) # Field name made lowercase. + enteredbyname = models.CharField( + db_column="EnteredByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + enteredbytribe = models.CharField( + db_column="EnteredByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbytitle = models.CharField( + db_column="EnteredByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + enteredbydate = models.DateTimeField( + db_column="EnteredByDate", blank=True, null=True + ) # Field name made lowercase. + modifiedbyname = models.CharField( + db_column="ModifiedByName", max_length=25, blank=True, null=True + ) # Field name made lowercase. + modifiedbytitle = models.CharField( + db_column="ModifiedByTitle", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbytribe = models.CharField( + db_column="ModifiedByTribe", max_length=100, blank=True, null=True + ) # Field name made lowercase. + modifiedbydate = models.DateTimeField( + db_column="ModifiedByDate", blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'ResourcesMediaEvents' - unique_together = (('resourceid', 'mediaid'),) + db_table = "ResourcesMediaEvents" + unique_together = (("resourceid", "mediaid"),) class Useraccess(models.Model): - accessid = models.AutoField(db_column='AccessID', primary_key=True) # Field name made lowercase. - accesslevel = models.CharField(db_column='AccessLevel', max_length=255, blank=True, null=True) # Field name made lowercase. + accessid = models.AutoField( + db_column="AccessID", primary_key=True + ) # Field name made lowercase. + accesslevel = models.CharField( + db_column="AccessLevel", max_length=255, blank=True, null=True + ) # Field name made lowercase. class Meta: managed = False - db_table = 'UserAccess' + db_table = "UserAccess" class Users(models.Model): - userid = models.AutoField(db_column='UserID', primary_key=True) # Field name made lowercase. - username = models.CharField(db_column='UserName', max_length=20) # Field name made lowercase. - password = models.CharField(db_column='Password', max_length=20) # Field name made lowercase. - firstname = models.CharField(db_column='FirstName', max_length=255) # Field name made lowercase. - lastname = models.CharField(db_column='LastName', max_length=255) # Field name made lowercase. - affiliation = models.CharField(db_column='Affiliation', max_length=255) # Field name made lowercase. - title = models.CharField(db_column='Title', max_length=255) # Field name made lowercase. - accesslevel = models.IntegerField(db_column='AccessLevel') # Field name made lowercase. + userid = models.AutoField( + db_column="UserID", primary_key=True + ) # Field name made lowercase. + username = models.CharField( + db_column="UserName", max_length=20 + ) # Field name made lowercase. + password = models.CharField( + db_column="Password", max_length=20 + ) # Field name made lowercase. + firstname = models.CharField( + db_column="FirstName", max_length=255 + ) # Field name made lowercase. + lastname = models.CharField( + db_column="LastName", max_length=255 + ) # Field name made lowercase. + affiliation = models.CharField( + db_column="Affiliation", max_length=255 + ) # Field name made lowercase. + title = models.CharField( + db_column="Title", max_length=255 + ) # Field name made lowercase. + accesslevel = models.IntegerField( + db_column="AccessLevel" + ) # Field name made lowercase. class Meta: managed = False - db_table = 'Users' + db_table = "Users"