From 02d1d21590d57da42d0af8c72d98021916fc4d0c Mon Sep 17 00:00:00 2001 From: JDTobin <90791836+JDTobin@users.noreply.github.com> Date: Tue, 4 Jun 2024 13:38:12 -0400 Subject: [PATCH] check for empty values for connecting field names support get_accessor_name method for connection determination catch duplicate entry errors --- p1_auth/models.py | 46 ++++++++++++++++++++++++++++++++-------------- setup.cfg | 2 +- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/p1_auth/models.py b/p1_auth/models.py index b9bd8ef..03d8b80 100644 --- a/p1_auth/models.py +++ b/p1_auth/models.py @@ -1,9 +1,12 @@ +import logging from copy import deepcopy from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist -from django.db import models +from django.db import DatabaseError, models +# Get an instance of a logger +logger = logging.getLogger(__name__) # Create your models here. class RelatedAssignment(models.Model): @@ -62,19 +65,34 @@ def validate(self, user, jwt_json): return False def __add_user(self, user, obj, field): - if field.many_to_many or field.one_to_many: - if hasattr(field, 'attname'): - getattr(obj, field.attname).add(user) - elif hasattr(field, 'related_name'): - getattr(obj, field.related_name).add(user) - elif field.many_to_one: - if hasattr(field.remote_field, 'attname'): - getattr(user, field.remote_field.attname).add(obj) - elif hasattr(field.remote_field, 'related_name'): - getattr(user, field.remote_field.related_name).add(obj) - elif field.one_to_one: - setattr(obj, field.name, user) - obj.save() + try: + if field.many_to_many or field.one_to_many: + if hasattr(field, 'get_accessor_name') and\ + field.get_accessor_name(): + getattr(obj, field.get_accessor_name()).add(user) + elif hasattr(field, 'attname') and field.attname: + getattr(obj, field.attname).add(user) + elif hasattr(field, 'related_name') and field.related_name: + getattr(obj, field.related_name).add(user) + elif field.many_to_one: + if hasattr(field.remote_field, 'get_accessor_name') and\ + field.remote_field.get_accessor_name(): + getattr(user, field.remote_field.get_accessor_name()).add(obj) + elif hasattr(field.remote_field, 'attname') and\ + field.remote_field.attname: + getattr(user, field.remote_field.attname).add(obj) + elif hasattr(field.remote_field, 'related_name') and\ + field.remote_field.related_name: + getattr(user, field.remote_field.related_name).add(obj) + elif field.one_to_one: + setattr(obj, field.name, user) + obj.save() + except DatabaseError as db_err: + if 'Duplicate entry' in str(db_err): + return + else: + logger.error("DB Error: %s", db_err) + def __str__(self): return f'{self.get_instance()} ({self.object_model})' diff --git a/setup.cfg b/setup.cfg index 2dea84f..b65033c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = p1-auth -version = 0.1.4 +version = 0.1.5 description = Installable Django Authentication that adds support for Platform One long_description = file:README.md long_description_content_type = text/markdown