class ContentType(Entity): name = TextProperty(max_length=100) app_label = TextProperty(max_length=100) model = TextProperty(max_length=100, verbose_name=_('python model class name')) objects = ContentTypeManager() class Meta: verbose_name = _('content type') verbose_name_plural = _('content types') kind = 'django_content_type' ordering = ('name', ) def __unicode__(self): return self.name def model_class(self): """Returns the Python model class for this type of content.""" from django.db import models return models.get_model(self.app_label, self.model) entity_class = model_class def get_object_for_this_type(self, **kwargs): """ Returns an object of this type for the keyword arguments given. Basically, this is a proxy around this object_type's get_object() model method. The ObjectNotExist exception, if thrown, will not be caught, so code that calls this method should catch it. """ return self.entity_class().object.get(**kwargs) def natural_key(self): return (self.app_label, self.model)
class ContentType(document.Document): name = fields.StringField(max_length=100) app_label = fields.StringField(max_length=100) model = fields.StringField(max_length=100, verbose_name=_('python model class name'), unique_with='app_label') objects = ContentTypeManager() class Meta: verbose_name = _('content type') verbose_name_plural = _('content types') # db_table = 'django_content_type' # ordering = ('name',) # unique_together = (('app_label', 'model'),) def __unicode__(self): return self.name def model_class(self): "Returns the Python model class for this type of content." from django.db import models return models.get_model(self.app_label, self.model) def get_object_for_this_type(self, **kwargs): """ Returns an object of this type for the keyword arguments given. Basically, this is a proxy around this object_type's get_object() model method. The ObjectNotExist exception, if thrown, will not be caught, so code that calls this method should catch it. """ return self.model_class()._default_manager.using( self._state.db).get(**kwargs) def natural_key(self): return (self.app_label, self.model)
class ContentType(document.Document): name = fields.StringField(max_length=100) app_label = fields.StringField(max_length=100) model = fields.StringField(max_length=100, verbose_name=_('python model class name'), unique_with='app_label') objects = ContentTypeManager() #Classe Meta é a classe da classe. class Meta: verbose_name = _('content type') verbose_name_plural = _('content types') def __unicode__(self): return self.name def model_class(self): """Retorna a classe Modle para esse tupo de contexto""" return models.get_model(self.app_label, self.model) def get_object_for_this_type(self, **kwargs): """Retorna um objeto desse tipo para os argumentos de palavra-chave fornecidos. A exceção ObjectNotExist, se lançada, não será detectada, então o código que chama este método deve pegá-lo""" return self.model_class()._default_manager.using(self._state.db).get(**kwargs) def natural_key(self): return (self.app_label, self.model)
class ContentType(models.Model): app_label = models.CharField(max_length=100) model = models.CharField(_('python model class name'), max_length=100) objects = ContentTypeManager() class Meta: app_label = _app_label verbose_name = _('content type') verbose_name_plural = _('content types') db_table = 'django_content_type' unique_together = (('app_label', 'model'), )
def test_cache_not_shared_between_managers(self): with self.assertNumQueries(1): ContentType.objects.get_for_model(ContentType) with self.assertNumQueries(0): ContentType.objects.get_for_model(ContentType) other_manager = ContentTypeManager() other_manager.model = ContentType with self.assertNumQueries(1): other_manager.get_for_model(ContentType) with self.assertNumQueries(0): other_manager.get_for_model(ContentType)
def set_version_diff(obj, v1, v2, setname, field): """Lookup an object that isn't the primary one, but is part of the same revision set, i.e. a foreign-key related date. TODO: Find a better way of doing this - it is probably HORRIBLY slow (although only used on the diff page, so not that important.""" import reversion from django.contrib.contenttypes.models import ContentTypeManager from diff_match_patch import diff_match_patch dmp = diff_match_patch() # FIXME: As well as being gross, this is fragile because # it doesn't account for more than one model = getattr(obj, setname).model ctype = ContentTypeManager().get_for_model(model) if not model in reversion.get_registered_models(): raise AttributeError("Model %r is not registered as a reversion model.") set1 = v1.revision.version_set.filter(content_type=ctype) set2 = v2.revision.version_set.filter(content_type=ctype) setobj1 = model.objects.filter([v.object_id for v in set1]) setobj2 = model.objects.filter([v.object_id for v in set2]) setids1 = [v.object_id for v in set1] setids2 = [v.object_id for v in set2] added = [] persisted = [] deleted = [] # NB: This assumes that if a version's object # is 'None' than it's not in a previous version. for vers in set1: if vers.object: if vers.object_id not in setids2: added.append(vers.object) else: persisted.append(vers.object) for vers in set2: if vers.object_id not in setids1: deleted.append(vers) out = [] for vers in added: diffs = dmp.diff_main(unicode(vers.field_dict[field]), u"") dmp.diff_cleanupSemantic(diffs) out.append(dmp.diff_prettyHtml(diffs)) for vers in persisted: out.append(vers.field_dict[field]) for vers in deleted: diffs = dmp.diff_main(u"", unicode(vers.field_dict[field])) dmp.diff_cleanupSemantic(diffs) out.append(dmp.diff_prettyHtml(diffs)) return u"<li>" + out.join(u"</li><li>") + u"</li>"
class CartItem(models.Model): cart = models.ForeignKey(Cart, verbose_name=u'Корзина') price = models.DecimalField(max_digits=18, decimal_places=2, verbose_name=u'Стоимость единицы товара') quantity = models.PositiveIntegerField(verbose_name=u'Количество', default=1) content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() objects = ContentTypeManager() class Meta: verbose_name = u'Элемент корзины' verbose_name_plural = u'Элементы корзины' ordering = ('cart', ) def __unicode__(self): return '' def total_price(self): return self.quantity * float(self.price) total_price = property(total_price) def get_item(self): try: return self.content_type.get_object_for_this_type( id=self.object_id) except ObjectDoesNotExist: return None def set_item(self, product): self.content_type = ContentType.objects.get_for_model(type(product)) self.object_id = product.pk product = property(get_item, set_item)
class ContentType(ContentType): class Meta: proxy = True objects = ContentTypeManager()
from mongodbforms.documentoptions import patch_document class ContentTypeManager(DjangoContentTypeManager): def get_query_set(self): """Returns a new QuerySet object. Subclasses can override this method to easily customize the behavior of the Manager. """ return QuerySet(self.model, self.model._get_collection()) def contribute_to_class(self, model, name): init_document_options(model) super(ContentTypeManager, self).contribute_to_class(model, name) def get_object_for_this_type(self, **kwargs): """ Returns an object of this type for the keyword arguments given. Basically, this is a proxy around this object_type's get_object() model method. The ObjectNotExist exception, if thrown, will not be caught, so code that calls this method should catch it. """ return self.model_class().objects.get(**kwargs) def model_class(self): return get_model_or_document(str(self.app_label), str(self.model)) patch_document(get_object_for_this_type, ContentType, bound=False) patch_document(model_class, ContentType, bound=False) manager = ContentTypeManager() manager.contribute_to_class(ContentType, "objects")
init_document_options(model) super(ContentTypeManager, self).contribute_to_class(model, name) def get_object_for_this_type(self, **kwargs): """ Returns an object of this type for the keyword arguments given. Basically, this is a proxy around this object_type's get_object() model method. The ObjectNotExist exception, if thrown, will not be caught, so code that calls this method should catch it. """ return self.model_class().objects.get(**kwargs) def model_class(self): return get_model_or_document(str(self.app_label), str(self.model)) patch_document(get_object_for_this_type, ContentType, bound=False) patch_document(model_class, ContentType, bound=False) manager = ContentTypeManager() manager.contribute_to_class(ContentType, 'objects') try: from grappelli.templatetags import grp_tags grp_tags.ContentType = ContentType except ImportError: pass