Source code for openassembly.pirate_social.models

from django.db import models
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
import datetime
import django.dispatch
from django.contrib import admin
from django.utils.translation import ugettext as _
from django.contrib.auth.models import User

from django.core.exceptions import ValidationError
from pirate_signals.models import relationship_event, delete_relationship_event

"""
Social module contains all references to the real world, social networks,
locations, photo verification systems, etc.
"""

"""
Locations can correspond to users, forum_blobs, or other objects.
"""


class Location(models.Model):
    city = models.TextField(max_length=500, null=True, blank=True)
    state = models.TextField(max_length=500, null=True, blank=True)
    country = models.TextField(max_length=500, null=True, blank=True)
    object_pk = models.CharField(_('object ID'), max_length=100)
    content_object = generic.GenericForeignKey(ct_field="content_type", fk_field="object_pk")
    content_type = models.ForeignKey(ContentType,
                                      verbose_name=_('content type'),
                                      related_name="content_type_set_for_%(class)s")


class Address(models.Model):
    address = models.CharField(max_length=500)
    zipcode = models.TextField(max_length=10)


class Subscription(models.Model):
    subscriber = models.ForeignKey(User, verbose_name=_('subscriber'), related_name=_('subscriber'))
    subscribee = models.ForeignKey(User, verbose_name=_('subscribee'), related_name=_('subscribee'))
    created_dt = models.DateTimeField(_('date/time subscription created'), auto_now_add=True)

    def __str__(self):
        return str(self.subscriber.username) + ":" + str(self.subscribee.username)


class RelationshipEvent(models.Model):
    initiator = models.ForeignKey(User, verbose_name=_('initiator user'), related_name=_('initiator'))
    target = models.ForeignKey(User, verbose_name=_('target user'), related_name=_('target'), blank=True, null=True)
    created_on = models.DateTimeField(_('date/time occured'), auto_now_add=True)
    ini_content_type = models.ForeignKey(ContentType,
                                      verbose_name=_('initiator content type'),
                                      related_name="ini_content_type_set_for_%(class)s")
    ini_object_pk = models.CharField(_('initiator object ID'), max_length=100)
    ini_content_object = generic.GenericForeignKey(ct_field="ini_content_type", fk_field="ini_object_pk")
    tar_content_type = models.ForeignKey(ContentType,
                                      verbose_name=_('target content type'),
                                      related_name="tar_content_type_set_for_%(class)s")
    tar_object_pk = models.CharField(_('target object ID'), max_length=100)
    tar_content_object = generic.GenericForeignKey(ct_field="tar_content_type", fk_field="tar_object_pk")

    class Meta:
        # Enforce unique tag association per object
        verbose_name = _('relationship event')
        verbose_name_plural = _('relationship events')
        unique_together = (('initiator', 'ini_object_pk', 'tar_object_pk'),)

    def __str__(self):
        return u'[%s:%s]' % (self.initiator.username, self.created_on)

    def get_ini_type(self):
        return str(self.ini_content_type)


[docs]def register_relationship_event(obj, parent, **kwargs): ini_c_type = ContentType.objects.get_for_model(obj) if parent != None: parent_c_type = ContentType.objects.get_for_model(parent) initiator = kwargs.get('initiator', None) if initiator == None: try: initiator = obj.user except: pass if parent != None: try: target_user = parent.user except: target_user = None rel = RelationshipEvent(initiator=initiator, ini_object_pk=obj.pk, ini_content_type=ini_c_type, tar_object_pk=parent.pk, tar_content_type=parent_c_type, target=target_user) else: rel = RelationshipEvent(initiator=initiator, ini_object_pk=obj.pk, ini_content_type=ini_c_type) rel.full_clean() rel.save()
[docs]def relationship_event_del(obj, parent, **kwargs): ini_c_type = ContentType.objects.get_for_model(obj) if parent != None: parent_c_type = ContentType.objects.get_for_model(parent) initiator = kwargs.get('initiator',None) if initiator == None: try: initiator = obj.user except: pass if parent != None: rel = RelationshipEvent.objects.get(initiator=initiator, ini_object_pk=obj.pk, tar_object_pk=parent.pk) rel.delete()
relationship_event.connect(register_relationship_event) delete_relationship_event.connect(relationship_event_del)