diff options
-rw-r--r-- | ishtar_common/admin.py | 3 | ||||
-rw-r--r-- | ishtar_common/context_processors.py | 30 | ||||
-rw-r--r-- | ishtar_common/forms_common.py | 66 | ||||
-rw-r--r-- | ishtar_common/migrations/0219_auto_20220120_1552.py | 33 | ||||
-rw-r--r-- | ishtar_common/models.py | 6 | ||||
-rw-r--r-- | ishtar_common/models_rest.py | 13 |
6 files changed, 123 insertions, 28 deletions
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py index b7de250c6..2dee828fc 100644 --- a/ishtar_common/admin.py +++ b/ishtar_common/admin.py @@ -1353,7 +1353,7 @@ admin_site.register(models.ProfileTypeSummary, ProfileTypeSummaryAdmin) class IshtarUserAdmin(admin.ModelAdmin): model = models.IshtarUser - search_fields = ("user_ptr", "person") + search_fields = ("user_ptr__username", "person__raw_name") admin_site.register(models.IshtarUser, IshtarUserAdmin) @@ -2327,6 +2327,7 @@ class ApiExternalSourceAdmin(admin.ModelAdmin): generate_match_document, update_association_from_match_document, ] + autocomplete_fields = ["users"] list_display = ("name", "url", "key") diff --git a/ishtar_common/context_processors.py b/ishtar_common/context_processors.py index 7e96bddbd..e1754e935 100644 --- a/ishtar_common/context_processors.py +++ b/ishtar_common/context_processors.py @@ -48,18 +48,6 @@ def get_base_context(request): menu.init() request.session['MENU'] = menu """ # menu is now in cache - put it back in session later? - if "EXTERNAL_SOURCES" not in request.session: - q = ApiExternalSource.objects - # TODO: check permissions - request.session["EXTERNAL_SOURCES"] = {} - if q.count(): - for source in q.all(): - request.session["EXTERNAL_SOURCES"][f"{source.id}||{source.name}"] = [ - f"{app_label}-{model_name}" - for app_label, model_name in ApiKeyMatch.objects.values_list( - "search_model__app_label", "search_model__model" - ).distinct() - ] current_action = None if "CURRENT_ACTION" in request.session: @@ -83,6 +71,24 @@ def get_base_context(request): menu.init() if hasattr(request.user, "ishtaruser") and request.user.ishtaruser: + if ( + request.user.ishtaruser.current_profile + and "EXTERNAL_SOURCES" not in request.session + ): + q = ApiExternalSource.objects.filter( + profiles=request.user.ishtaruser.current_profile + ) + request.session["EXTERNAL_SOURCES"] = {} + if q.count(): + for source in q.all(): + request.session["EXTERNAL_SOURCES"][ + f"{source.id}||{source.name}" + ] = [ + f"{app_label}-{model_name}" + for app_label, model_name in ApiKeyMatch.objects.values_list( + "search_model__app_label", "search_model__model" + ).distinct() + ] if request.user.ishtaruser.has_right("administrator", session=request.session): dct["ADMIN"] = True if ( diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index 70727b243..0cdb70a36 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -44,7 +44,7 @@ from django.utils.text import slugify from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _, pgettext -from . import models +from . import models, models_rest from . import widgets from bootstrap_datepicker.widgets import DatePicker from ishtar_common.templatetags.link_to_window import simple_link_to_window @@ -705,7 +705,7 @@ class QAPersonFormMulti(QAForm): associated_models = { "qa_title": models.TitleType, "qa_attached_to": models.Organization, - "qa_person_types": models.PersonType + "qa_person_types": models.PersonType, } MULTI = True @@ -726,7 +726,7 @@ class QAPersonFormMulti(QAForm): TYPES = [ FieldType("qa_title", models.TitleType), - FieldType('qa_person_types', models.PersonType, is_multiple=True), + FieldType("qa_person_types", models.PersonType, is_multiple=True), ] def _get_qa_attached_to(self, value): @@ -1159,7 +1159,7 @@ class ProfilePersonForm(forms.Form): auto_pin = forms.BooleanField( label=_("Pin automatically items on creation and modification"), required=False ) - display_pin_menu = forms.BooleanField(label=_("Show pin menu"), required=False) + # display_pin_menu = forms.BooleanField(label=_("Show pin menu"), required=False) duplicate_profile = forms.BooleanField( label=_("Duplicate this profile"), required=False @@ -1184,11 +1184,46 @@ class ProfilePersonForm(forms.Form): initial["name"] = current_profile.name or current_profile.profile_type initial["profile_type"] = current_profile.profile_type.pk initial["auto_pin"] = current_profile.auto_pin - initial["display_pin_menu"] = current_profile.display_pin_menu + # initial["display_pin_menu"] = current_profile.display_pin_menu kwargs["initial"] = initial super(ProfilePersonForm, self).__init__(*args, **kwargs) self.fields["current_profile"].choices = choices + current_external_sources = ( + [src.pk for src in current_profile.external_sources.all()] + if current_profile + else [] + ) + extra_fields = [] + q = models_rest.ApiExternalSource.objects.filter(users=self.user.ishtaruser) + for src in q.all(): + initial = True if src.pk in current_external_sources else False + extra_fields.append( + ( + f"external_source_{src.pk}", + forms.BooleanField( + label=_(f"External source - {src.name}"), + required=False, + initial=initial, + ), + ) + ) + + self.fields[f"external_source_{src.pk}"] = forms.BooleanField( + label=_(f"External source - {src.name}"), + required=False, + initial=initial, + ) + if extra_fields: + # reorder fields + fields = OrderedDict() + for key in self.fields.keys(): + if key == "duplicate_profile": + for extra_key, extra_field in extra_fields: + fields[extra_key] = extra_fields + fields[key] = self.fields[key] + self.fields = fields + if ( not current_profile or not self.user.ishtaruser.person.profiles.filter( @@ -1264,9 +1299,16 @@ class ProfilePersonForm(forms.Form): profile.current = True profile.name = name profile.auto_pin = self.cleaned_data["auto_pin"] - profile.display_pin_menu = self.cleaned_data["display_pin_menu"] + # profile.display_pin_menu = self.cleaned_data["display_pin_menu"] profile.save() + profile.external_sources.clear() + q = models_rest.ApiExternalSource.objects.filter(users=self.user.ishtaruser) + for src in q.all(): + if self.cleaned_data.get(f"external_source_{src.pk}", False): + profile.external_sources.add(src) clean_session_cache(session) + if "EXTERNAL_SOURCES" in session: + session.pop("EXTERNAL_SOURCES") class TownForm(forms.Form): @@ -2096,15 +2138,9 @@ class QADocumentFormMulti(QAForm): qa_creation_date = forms.DateField( label=_("Creation date"), widget=DatePicker, required=False ) - qa_format_type = forms.ChoiceField( - label=_("Format"), choices=[], required=False - ) - qa_support_type = forms.ChoiceField( - label=_("Medium"), choices=[], required=False - ) - qa_scale = forms.CharField( - label=_("Scale"), max_length=30, required=False - ) + qa_format_type = forms.ChoiceField(label=_("Format"), choices=[], required=False) + qa_support_type = forms.ChoiceField(label=_("Medium"), choices=[], required=False) + qa_scale = forms.CharField(label=_("Scale"), max_length=30, required=False) TYPES = [ FieldType("qa_source_type", models.SourceType), diff --git a/ishtar_common/migrations/0219_auto_20220120_1552.py b/ishtar_common/migrations/0219_auto_20220120_1552.py new file mode 100644 index 000000000..58d5930a9 --- /dev/null +++ b/ishtar_common/migrations/0219_auto_20220120_1552.py @@ -0,0 +1,33 @@ +# Generated by Django 2.2.24 on 2022-01-20 15:52 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('ishtar_common', '0218_apisheetfilter'), + ] + + operations = [ + migrations.AlterModelOptions( + name='apiexternalsource', + options={'ordering': ('name',), 'verbose_name': 'API - Search - External source', 'verbose_name_plural': 'API - Search - External sources'}, + ), + migrations.AddField( + model_name='apiexternalsource', + name='users', + field=models.ManyToManyField(blank=True, to='ishtar_common.IshtarUser'), + ), + migrations.AddField( + model_name='userprofile', + name='external_sources', + field=models.ManyToManyField(blank=True, related_name='profiles', to='ishtar_common.ApiExternalSource'), + ), + migrations.AlterField( + model_name='apisheetfilter', + name='api_search_model', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sheet_filters', to='ishtar_common.ApiSearchModel'), + ), + ] diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 8f916538c..a03b90434 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -3008,6 +3008,9 @@ class UserProfile(models.Model): areas = models.ManyToManyField( "Area", verbose_name=_("Areas"), blank=True, related_name="profiles" ) + external_sources = models.ManyToManyField( + "ApiExternalSource", blank=True, related_name="profiles" + ) current = models.BooleanField(_("Current profile"), default=False) show_field_number = models.BooleanField(_("Show field number"), default=False) auto_pin = models.BooleanField(_("Automatically pin"), default=False) @@ -3046,6 +3049,7 @@ class UserProfile(models.Model): def duplicate(self, **kwargs): areas = [area for area in self.areas.all()] + external_sources = [external_source for external_source in self.external_sources.all()] new_item = self new_item.pk = None name = self.name @@ -3061,6 +3065,8 @@ class UserProfile(models.Model): new_item.save() for area in areas: new_item.areas.add(area) + for src in external_sources: + new_item.external_sources.add(src) return new_item def save( diff --git a/ishtar_common/models_rest.py b/ishtar_common/models_rest.py index 18f6c4c3f..b0ed5cbd4 100644 --- a/ishtar_common/models_rest.py +++ b/ishtar_common/models_rest.py @@ -93,6 +93,7 @@ class ApiExternalSource(models.Model): url = models.URLField(verbose_name=_("URL")) name = models.CharField(verbose_name=_("Name"), max_length=200) key = models.CharField(_("Key"), max_length=40) + users = models.ManyToManyField("IshtarUser", blank=True) match_document = models.FileField( _("Match document"), blank=True, @@ -108,10 +109,22 @@ class ApiExternalSource(models.Model): class Meta: verbose_name = _("API - Search - External source") verbose_name_plural = _("API - Search - External sources") + ordering = ("name",) def __str__(self): return self.name + def save(self, force_insert=False, force_update=False, using=None, + update_fields=None): + super().save(force_insert, force_update, using, update_fields) + # remove external sources from profiles if not in user anymore + UserProfile = apps.get_model("ishtar_common", "UserProfile") + q = UserProfile.objects.filter(external_sources=self).exclude( + person__ishtaruser__in=list(self.users.all()) + ) + for profile in q.all(): + profile.external_sources.remove(self) + def update_matches(self, content): result = { "created": 0, |