From a9856294c046289dc47b404b07b8fb5754714ccf Mon Sep 17 00:00:00 2001 From: Tyson Clugg Date: Thu, 16 Jul 2015 16:26:53 +1000 Subject: [PATCH 1/5] Simplify ModelAdmin registration. --- dddp/admin.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/dddp/admin.py b/dddp/admin.py index ab21e4f..9f5e780 100644 --- a/dddp/admin.py +++ b/dddp/admin.py @@ -103,8 +103,7 @@ class SubscriptionCollection(admin.ModelAdmin): ] -for name, attr in vars(models).items(): - if hasattr(attr, '_meta'): - model_admin = locals().get(name, None) - if model_admin is not False: - admin.site.register(attr, model_admin) +admin.site.register(models.ObjectMapping, ObjectMapping) +admin.site.register(models.Subscription, Subscription) +admin.site.register(models.SubscriptionCollection, SubscriptionCollection) +admin.site.register(models.Connection) From f43097a9cafb430c78ea8cb9e2fd3b5644ad945e Mon Sep 17 00:00:00 2001 From: Tyson Clugg Date: Fri, 17 Jul 2015 17:46:46 +1000 Subject: [PATCH 2/5] Add dddp.models.get_object_ids helper function. --- dddp/models.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/dddp/models.py b/dddp/models.py index 8eea57d..ccc3a08 100644 --- a/dddp/models.py +++ b/dddp/models.py @@ -82,6 +82,26 @@ def get_object_id(model, meteor_id): ).values_list('object_id', flat=True).get() +@transaction.atomic +def get_object_ids(model, meteor_ids): + """Return all object IDs for the given meteor_ids.""" + if model is ObjectMapping: + # this doesn't make sense - raise TypeError + raise TypeError("Can't map ObjectMapping instances through self.") + content_type = ContentType.objects.get_for_model(model) + result = collections.OrderedDict( + (str(meteor_id), None) + for meteor_id + in meteor_ids + ) + for meteor_id, object_id in ObjectMapping.objects.filter( + content_type=content_type, + meteor_id__in=meteor_ids, + ).values_list('meteor_id', 'object_id'): + result[meteor_id] = object_id + return result + + @transaction.atomic def get_object(model, meteor_id, *args, **kwargs): """Return an object for the given meteor_id.""" From 797e10e08cb8a4539f0eaefa966248c98bda6ff0 Mon Sep 17 00:00:00 2001 From: Tyson Clugg Date: Fri, 17 Jul 2015 17:48:25 +1000 Subject: [PATCH 3/5] Add ObjectMappingMixin using GenericRelation back to ObjectMapping model. --- dddp/models.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/dddp/models.py b/dddp/models.py index ccc3a08..bd384f3 100644 --- a/dddp/models.py +++ b/dddp/models.py @@ -5,6 +5,9 @@ import collections from django.db import models, transaction from django.conf import settings +from django.contrib.contenttypes.fields import ( + GenericRelation, GenericForeignKey, +) from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.utils.encoding import python_2_unicode_compatible @@ -131,7 +134,7 @@ class ObjectMapping(models.Model): meteor_id = AleaIdField() content_type = models.ForeignKey(ContentType, db_index=True) object_id = models.CharField(max_length=255) - # content_object = GenericForeignKey('content_type', 'object_id') + content_object = GenericForeignKey('content_type', 'object_id') def __str__(self): """Text representation of a mapping.""" @@ -227,3 +230,16 @@ class SubscriptionCollection(models.Model): self.collection_name, self.model_name, ) + + +class ObjectMappingMixin(models.Model): + + """Model mixin that provides GenericRelation back to ObjectMapping model.""" + + object_mapping = GenericRelation(ObjectMapping) + + class Meta(object): + + """ObjectMappingMixin model meta options.""" + + abstract = True From 8eb2a3d49257f714d7efd4b89815c68fc4945922 Mon Sep 17 00:00:00 2001 From: Tyson Clugg Date: Fri, 17 Jul 2015 17:49:23 +1000 Subject: [PATCH 4/5] Add short_description to get_meteor_id helper for use in ModelAdmin list_display. --- dddp/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dddp/models.py b/dddp/models.py index bd384f3..b4515f0 100644 --- a/dddp/models.py +++ b/dddp/models.py @@ -44,6 +44,7 @@ def get_meteor_id(obj_or_model, obj_pk=None): object_id=obj_pk, meteor_id=meteor_random_id('/collection/%s' % meta), ).meteor_id +get_meteor_id.short_description = 'DDP ID' # nice title for admin list_display @transaction.atomic @@ -77,7 +78,6 @@ def get_object_id(model, meteor_id): if model is ObjectMapping: # this doesn't make sense - raise TypeError raise TypeError("Can't map ObjectMapping instances through self.") - # Django model._meta is now public API -> pylint: disable=W0212 content_type = ContentType.objects.get_for_model(model) return ObjectMapping.objects.filter( content_type=content_type, From ab29362ea17334e65eaf41e578e961c0055930d3 Mon Sep 17 00:00:00 2001 From: Tyson Clugg Date: Fri, 17 Jul 2015 18:09:07 +1000 Subject: [PATCH 5/5] Update CHANGES.rst, bump version number. --- CHANGES.rst | 6 ++++++ setup.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 39d433a..637d291 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,12 @@ Change Log ========== +0.9.13 +------ +* Add dddp.models.get_object_ids helper function. +* Add ObjectMappingMixini abstract model mixin providing + GenericRelation back to ObjectMapping model. + 0.9.12 ------ * Bugfix /app.model/schema helper method on collections to work with diff --git a/setup.py b/setup.py index 2494769..241f0c9 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ from setuptools import setup, find_packages setup( name='django-ddp', - version='0.9.12', + version='0.9.13', description=__doc__, long_description=open('README.rst').read(), author='Tyson Clugg',