示例#1
0
class SkillTest(models.Model):
    class Meta:
        unique_together = ("profile", "expertratings_test")

    profile = models.ForeignKey('accounts.Profile')
    expertratings_test = models.ForeignKey('expertratings.SkillTest')
    skills = tagulous.models.TagField(to=Skills)
    ticket_url = models.CharField(max_length=255, blank=True, null=True)

    @property
    def developer(self):
        return self.profile

    def create_ticket(self):
        self.ticket_url = self.expertratings_test.create_ticket(
            user_id=self.developer.id)
        self.save()
        return self.ticket_url

    @property
    def results(self):
        return self.expertratings_test.results(user=self.developer)

    @property
    def test_details(self):
        return self.expertratings_test
示例#2
0
class Connection(models.Model):
    from_user = models.ForeignKey(settings.AUTH_USER_MODEL,
                                  on_delete=models.CASCADE,
                                  related_name='connections_initiated')
    to_user = models.ForeignKey(settings.AUTH_USER_MODEL,
                                on_delete=models.CASCADE,
                                related_name='connection_requests')
    accepted = models.BooleanField(default=False)
    responded = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return '%s -> %s' % (self.from_user.get_short_name,
                             self.to_user.get_short_name)

    class Meta:
        ordering = ['-created_at']

    @allow_staff_or_superuser
    def has_object_read_permission(self, request):
        return request.user == self.from_user or request.user == self.to_user

    @allow_staff_or_superuser
    def has_object_write_permission(self, request):
        return request.user == self.from_user or request.user == self.to_user
示例#3
0
class SavedTask(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    task = models.ForeignKey(Task, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return '%s - %s' % (self.user.get_short_name()
                            or self.user.username, self.task.summary)

    @staticmethod
    @allow_staff_or_superuser
    def has_read_permission(request):
        return True

    @allow_staff_or_superuser
    def has_object_read_permission(self, request):
        return request.user == self.user

    @staticmethod
    @allow_staff_or_superuser
    def has_write_permission(request):
        return request.user.type == USER_TYPE_DEVELOPER

    @allow_staff_or_superuser
    def has_object_write_permission(self, request):
        return request.user == self.user
示例#4
0
class TaskRequest(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.DO_NOTHING)
    task = models.ForeignKey(Task, on_delete=models.CASCADE)
    type = models.PositiveSmallIntegerField(
        choices=TASK_REQUEST_CHOICES,
        help_text=','.join(
            ['%s - %s' % (item[0], item[1]) for item in TASK_REQUEST_CHOICES]))
    created_at = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return '%s - %s' % (self.get_type_display(), self.task.summary)

    @staticmethod
    @allow_staff_or_superuser
    def has_read_permission(request):
        return True

    @allow_staff_or_superuser
    def has_object_read_permission(self, request):
        return self.task.has_object_read_permission(request)

    @staticmethod
    @allow_staff_or_superuser
    def has_write_permission(request):
        return request.user.type == USER_TYPE_DEVELOPER

    @allow_staff_or_superuser
    def has_object_write_permission(self, request):
        return request.user == self.user
示例#5
0
class Participation(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.DO_NOTHING)
    task = models.ForeignKey(Task, on_delete=models.CASCADE)
    accepted = models.BooleanField(default=False)
    responded = models.BooleanField(default=False)
    assignee = models.BooleanField(default=False)
    role = models.CharField(max_length=100, default='Developer')
    share = models.IntegerField(blank=True, null=True)
    satisfaction = models.SmallIntegerField(blank=True, null=True)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL,
                                   related_name='participants_added')
    created_at = models.DateTimeField(auto_now_add=True)
    activated_at = models.DateTimeField(blank=True, null=True)
    ratings = GenericRelation(Rating, related_query_name='participants')

    def __unicode__(self):
        return '%s - %s' % (self.user.get_short_name()
                            or self.user.username, self.task.title)

    class Meta:
        unique_together = ('user', 'task')
        verbose_name_plural = 'participation'

    @allow_staff_or_superuser
    def has_object_read_permission(self, request):
        return self.task.has_object_read_permission(request)

    @allow_staff_or_superuser
    def has_object_write_permission(self, request):
        return request.user == self.user or request.user == self.task.user
示例#6
0
class Connection(models.Model):
    from_user = models.ForeignKey(settings.AUTH_USER_MODEL,
                                  on_delete=models.CASCADE,
                                  related_name='connections_initiated')
    to_user = models.ForeignKey(settings.AUTH_USER_MODEL,
                                on_delete=models.CASCADE,
                                related_name='connection_requests')
    accepted = models.BooleanField(default=False)
    responded = models.BooleanField(default=False)
    status = models.CharField(max_length=30,
                              choices=CONNECTION_STATUS_CHOICES,
                              default=STATUS_INITIAL,
                              help_text=', '.join([
                                  '%s - %s' % (item[0], item[1])
                                  for item in CONNECTION_STATUS_CHOICES
                              ]))
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '%s -> %s' % (self.from_user.get_short_name,
                             self.to_user.get_short_name)

    class Meta:
        ordering = ['-created_at']

    @allow_staff_or_superuser
    def has_object_read_permission(self, request):
        return request.user == self.from_user or request.user == self.to_user

    @allow_staff_or_superuser
    def has_object_write_permission(self, request):
        return request.user == self.from_user or request.user == self.to_user
class QuestionnaireResponse(models.Model):
    questionnaire = models.ForeignKey('questionnaire.Questionnaire',
                                      on_delete=models.RESTRICT,
                                      related_name='questionnaire_responses')
    student_profile = models.ForeignKey(
        'users.StudentProfile',
        on_delete=models.CASCADE,
        related_name='student_profile_responses')
示例#8
0
class UserRequest(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING, related_name='user_requests')
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING,
                                   related_name='users_requested')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '{} requested {}'.format(self.created_by.short_name(), self.user.short_name())
示例#9
0
class VerificationTest(models.Model):
    objects = VerificationTestManager()

    skill = models.ForeignKey(Skills, on_delete=models.CASCADE)
    skilltest = models.ForeignKey('expertratings.SkillTest',
                                  on_delete=models.CASCADE)
    relevance = models.FloatField()

    class Meta:
        ordering = ('-relevance', )
class Answer(models.Model):
    questionnaire_response = models.ForeignKey(
        'questionnaire.QuestionnaireResponse',
        on_delete=models.CASCADE,
        related_name='answers')
    question = models.ForeignKey('questionnaire.Question',
                                 on_delete=models.RESTRICT,
                                 related_name='question_responses')
    option = models.ForeignKey('questionnaire.Option',
                               on_delete=models.RESTRICT,
                               related_name='option_responses')
class Submission(models.Model):
    student_profile = models.ForeignKey('users.StudentProfile',
                                        on_delete=models.CASCADE,
                                        related_name='student_submissions')
    uploaded_file = models.FileField(upload_to='student_uploads/')
    uploaded_time = models.DateTimeField(auto_now_add=True)
    post = models.ForeignKey('blog.Post',
                             on_delete=models.CASCADE,
                             related_name='post_submissions')

    class Meta:
        unique_together = ('student_profile', 'post')
示例#12
0
class Document(models.Model):
    project = models.ForeignKey(Project)
    type = models.CharField(choices=PROJECT_DOCUMENT_CHOICES,
                            max_length=30,
                            default=DOC_OTHER)
    url = models.URLField(blank=True, null=True)
    file = models.FileField(verbose_name='Upload',
                            upload_to='documents/%Y/%m/%d',
                            blank=True,
                            null=True)
    title = models.CharField(max_length=100, blank=True, null=True)
    description = models.TextField(blank=True, null=True)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    legacy_id = models.PositiveIntegerField(blank=True, null=True)
    migrated_at = models.DateTimeField(blank=True, null=True)

    def __str__(self):
        return '{} | {}'.format(self.type, self.project)

    class Meta:
        ordering = ['-created_at']

    @staticmethod
    @allow_staff_or_superuser
    def has_read_permission(request):
        return True

    @allow_staff_or_superuser
    def has_object_read_permission(self, request):
        return self.project.is_participant(request.user)

    @staticmethod
    @allow_staff_or_superuser
    def has_write_permission(request):
        return request.user.is_project_manager or request.user.is_project_owner

    @allow_staff_or_superuser
    def has_object_write_permission(self, request):
        return request.user == self.created_by

    @property
    def download_url(self):
        if self.file:
            return '{}{}'.format(
                not re.match(r'://', self.file.url) and TUNGA_URL or '',
                self.file.url)
        elif self.url:
            return self.url
        return None
示例#13
0
class Application(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    task = models.ForeignKey(Task, on_delete=models.CASCADE)
    accepted = models.BooleanField(default=False)
    responded = models.BooleanField(default=False)
    pitch = models.CharField(max_length=1000, blank=True, null=True)
    hours_needed = models.PositiveIntegerField(blank=True, null=True)
    hours_available = models.PositiveIntegerField(blank=True, null=True)
    remarks = models.TextField(
        blank=True,
        null=True)  # These will also be delivered as messages to the client
    deliver_at = models.DateTimeField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    channels = GenericRelation(Channel, related_query_name='task_applications')

    def __unicode__(self):
        return '%s - %s' % (self.user.get_short_name()
                            or self.user.username, self.task.summary)

    class Meta:
        unique_together = ('user', 'task')

    @staticmethod
    @allow_staff_or_superuser
    def has_read_permission(request):
        return True

    @allow_staff_or_superuser
    def has_object_read_permission(self, request):
        return self.has_object_update_permission(request)

    @staticmethod
    @allow_staff_or_superuser
    def has_write_permission(request):
        return request.user.type == USER_TYPE_DEVELOPER

    @staticmethod
    @allow_staff_or_superuser
    def has_update_permission(request):
        return True

    @allow_staff_or_superuser
    def has_object_write_permission(self, request):
        return request.user == self.user

    @allow_staff_or_superuser
    def has_object_update_permission(self, request):
        # Task owner can update applications
        return request.user == self.user or request.user == self.task.user
示例#14
0
class Connection(models.Model):
    """
    TODO: When implementing the `request_connection` api:
    * Add `from_type = { REQUESTER, REQUESTEE }`
    * Add `status = { requested, accepted, connected }`
    * Don't show `contact_details` unless `status == connected`
    """
    class Meta:
        unique_together = ('from_profile', 'to_profile')

    date_created = models.DateTimeField(auto_now_add=True)
    from_profile = models.ForeignKey('accounts.Profile',
                                     related_name='from_profile')
    to_profile = models.ForeignKey('accounts.Profile',
                                   related_name='to_profile')
示例#15
0
class Employee(models.Model):
    company = models.ForeignKey('business.Company')
    profile = models.ForeignKey('accounts.Profile')
    primary = models.BooleanField(default=False)
    title = models.CharField(max_length=255, blank=True, null=True)
    start_date = models.DateField(blank=True, null=True)
    end_date = models.DateField(blank=True, null=True)
    current = models.BooleanField(default=True)
    city = models.CharField(max_length=255, blank=True, null=True)
    state = models.CharField(max_length=255, blank=True, null=True)
    country = models.CharField(max_length=255, blank=True, null=True)
    description = models.TextField(blank=True, null=True)

    class Meta:
        ordering = ['-current', '-end_date', '-start_date']
示例#16
0
class AppIntegration(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    provider = models.CharField(
        max_length=30,
        choices=APP_INTEGRATION_PROVIDER_CHOICES,
        help_text=','.join([
            '%s - %s' % (item[0], item[1])
            for item in APP_INTEGRATION_PROVIDER_CHOICES
        ]))
    token = models.TextField(
        verbose_name='token',
        help_text='"oauth_token" (OAuth1) or access token (OAuth2)')
    token_secret = models.TextField(
        blank=True,
        verbose_name='token secret',
        help_text='"oauth_token_secret" (OAuth1) or refresh token (OAuth2)')
    extra = models.TextField(blank=True,
                             null=True)  # JSON formatted extra details
    expires_at = models.DateTimeField(blank=True,
                                      null=True,
                                      verbose_name='expires at')
    updated_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        unique_together = ('user', 'provider')
        verbose_name = 'app integration'
        verbose_name_plural = 'app integrations'

    def __unicode__(self):
        return '%s - %s' % (self.user.get_short_name(),
                            self.get_provider_display())
示例#17
0
class BaseModel(TimetrackingBaseModel):
    id = models.UUIDField(primary_key=True,
                          default=uuid.uuid4,
                          editable=False,
                          verbose_name=_('BaseModel.id.verbose_name'),
                          help_text=_('BaseModel.id.help_text'))
    user = models.ForeignKey(  # "Owner" of this entry
        settings.AUTH_USER_MODEL,
        related_name='+',
        on_delete=models.CASCADE,
        editable=False,  # Must be set automatically and never changed
        verbose_name=_('BaseModel.user.verbose_name'),
        help_text=_('BaseModel.user.help_text'))
    name = models.CharField(max_length=255,
                            verbose_name=_('BaseModel.name.verbose_name'),
                            help_text=_('BaseModel.name.help_text'))
    tags = tagulous.models.TagField(
        blank=True,
        case_sensitive=False,
        force_lowercase=False,
        space_delimiter=False,
        max_count=10,
        verbose_name=_('BaseModel.tags.verbose_name'),
        help_text=_('BaseModel.tags.help_text'))

    def __str__(self):
        return self.name

    class Meta:
        abstract = True
class Release(models.Model):
    types = [
        ('release', 'release'),
        ('event', 'event'),
    ]

    release_date = models.DateField()
    release_type = models.CharField(max_length=999, choices=types)
    title = models.CharField(max_length=999)
    important_tags = tagulous.models.TagField(
        to="general.customtag",
        related_name="release_important_tags",
        default=None,
        blank=True)
    other_tags = tagulous.models.TagField(to="general.customtag",
                                          related_name="release_other_tags",
                                          default=None,
                                          blank=True)
    snippet = models.CharField(max_length=999, blank=True, null=True)
    description = models.TextField(
        blank=True,
        null=True,
    )
    video = models.CharField(max_length=999, blank=True, null=True)
    external_link = models.CharField(max_length=999, blank=True, null=True)
    review_link = models.ForeignKey(Publication,
                                    blank=True,
                                    null=True,
                                    related_name="review_link",
                                    on_delete=models.CASCADE)

    def __str__(self):
        return self.title
示例#19
0
class BTCWallet(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    provider = models.CharField(max_length=30,
                                choices=BTC_WALLET_PROVIDER_CHOICES,
                                help_text=','.join([
                                    '%s - %s' % (item[0], item[1])
                                    for item in BTC_WALLET_PROVIDER_CHOICES
                                ]))
    token = models.TextField(
        verbose_name='token',
        help_text='"oauth_token" (OAuth1) or access token (OAuth2)')
    token_secret = models.TextField(
        blank=True,
        verbose_name='token secret',
        help_text='"oauth_token_secret" (OAuth1) or refresh token (OAuth2)')
    expires_at = models.DateTimeField(blank=True,
                                      null=True,
                                      verbose_name='expires at')
    updated_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        unique_together = ('user', 'provider')
        verbose_name = 'bitcoin wallet'

    def __unicode__(self):
        return '%s - %s' % (self.user.get_short_name(),
                            self.get_provider_display())
class PublicationScore(models.Model):
    publication = models.ForeignKey(Publication,
                                    related_name="scores",
                                    on_delete=models.CASCADE)
    types = [
        ('adiccion', 'ADICCIÓN'),
        ('ambientacion', 'AMBIENTACIÓN'),
        ('combate', 'COMBATE'),
        ('dificultad', 'DIFICULTAD'),
        ('equipo', 'EQUIPO'),
        ('estrategia', 'ESTRATEGIA'),
        ('terror', 'TERROR'),
        ('puzzles', 'PUZZLES'),
        ('monstruos', 'MONSTRUOS'),
        ('narrativa', 'NARRATIVA'),
    ]

    name = models.CharField(max_length=100, choices=types)
    types = [(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5')]

    value = models.IntegerField(choices=types)
    description = models.CharField(max_length=999, default=None, null=True)

    def __str__(self):
        return self.publication.slug + " - " + self.name
示例#21
0
class DeveloperInvitation(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField(unique=True, validators=[validate_email])
    type = models.IntegerField(choices=USER_TYPE_CHOICES,
                               default=USER_TYPE_DEVELOPER)
    invitation_key = models.UUIDField(default=uuid.uuid4,
                                      editable=False,
                                      unique=True)
    invitation_sent_at = models.DateTimeField(blank=True,
                                              null=True,
                                              editable=False)
    used = models.BooleanField(default=False)
    used_at = models.DateTimeField(blank=True, null=True, editable=False)
    resent = models.BooleanField(default=False)
    resent_at = models.DateTimeField(blank=True, null=True, editable=False)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL,
                                   on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = 'user invitation'

    def __unicode__(self):
        return self.display_name

    @property
    def display_name(self):
        return '%s %s' % (self.first_name, self.last_name)
示例#22
0
class IntegrationMeta(models.Model):
    integration = models.ForeignKey(Integration, on_delete=models.CASCADE)
    meta_key = models.CharField(max_length=30)
    meta_value = models.CharField(max_length=30)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL,
                                   related_name='integration_meta_created',
                                   blank=True,
                                   null=True,
                                   on_delete=models.DO_NOTHING)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return '%s | %s - %s' % (self.integration, self.meta_key,
                                 self.meta_value)

    class Meta:
        ordering = ['created_at']
示例#23
0
class ProgressEvent(models.Model):
    task = models.ForeignKey(Task, on_delete=models.CASCADE)
    type = models.PositiveSmallIntegerField(
        choices=PROGRESS_EVENT_TYPE_CHOICES,
        default=PROGRESS_EVENT_TYPE_DEFAULT,
        help_text=','.join([
            '%s - %s' % (item[0], item[1])
            for item in PROGRESS_EVENT_TYPE_CHOICES
        ]))
    due_at = models.DateTimeField()
    title = models.CharField(max_length=200, blank=True, null=True)
    description = models.CharField(max_length=1000, blank=True, null=True)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL,
                                   related_name='progress_events_created',
                                   blank=True,
                                   null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    last_reminder_at = models.DateTimeField(blank=True, null=True)

    def __unicode__(self):
        return '%s | %s - %s' % (self.get_type_display(), self.task.summary,
                                 self.due_at)

    class Meta:
        unique_together = ('task', 'due_at')
        ordering = ['due_at']

    @staticmethod
    @allow_staff_or_superuser
    def has_read_permission(request):
        return True

    @allow_staff_or_superuser
    def has_object_read_permission(self, request):
        return self.task.has_object_read_permission(request)

    @staticmethod
    @allow_staff_or_superuser
    def has_write_permission(request):
        return request.user.type == USER_TYPE_PROJECT_OWNER

    @allow_staff_or_superuser
    def has_object_write_permission(self, request):
        return request.user == self.task.user
示例#24
0
class ProjectMeta(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    meta_key = models.CharField(max_length=30)
    meta_value = models.TextField()
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL,
                                   related_name='project_meta_created',
                                   blank=True,
                                   null=True,
                                   on_delete=models.DO_NOTHING)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return '{} | {} - {}'.format(self.project, self.meta_key,
                                     self.meta_value)

    class Meta:
        ordering = ['created_at']
        unique_together = ('project', 'meta_key')
示例#25
0
class BaseMemoAttachmentModel(BaseAttachmentModel):
    """
    Base model to store files or images to Memos
    """
    memo = models.ForeignKey('MemoModel', on_delete=models.CASCADE)

    def full_clean(self, **kwargs):
        return super().full_clean(parent_instance=self.memo, **kwargs)

    class Meta:
        abstract = True
示例#26
0
class BaseItemAttachmentModel(BaseAttachmentModel):
    """
    Base model to store files or images to Items
    """
    item = models.ForeignKey('ItemModel', on_delete=models.CASCADE)

    def full_clean(self, **kwargs):
        return super().full_clean(parent_instance=self.item, **kwargs)

    class Meta:
        abstract = True
示例#27
0
class SocialLink(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    platform = models.ForeignKey(SocialPlatform)
    link = models.URLField(blank=True, null=True)
    username = models.CharField(max_length=100, blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return '%s -  %s' % (self.user.get_short_name(), self.platform)

    class Meta:
        unique_together = ('user', 'platform')

    @allow_staff_or_superuser
    def has_object_read_permission(self, request):
        return True

    @allow_staff_or_superuser
    def has_object_write_permission(self, request):
        return request.user == self.user
class Option(models.Model):
    identifier = models.UUIDField(default=uuid.uuid4,
                                  editable=False,
                                  unique=True)
    body = models.CharField(max_length=1000)
    question = models.ForeignKey('Question',
                                 related_name='option',
                                 on_delete=models.CASCADE)
    continuation_questionnaire = models.ForeignKey('Questionnaire',
                                                   related_name='from_options',
                                                   null=True,
                                                   blank=True,
                                                   on_delete=models.SET_NULL)
    tags = tagulous.models.TagField(related_name='options', to=Tag, blank=True)

    def clean(self):
        if self.continuation_questionnaire == self.question.questionnaire:
            raise ValidationError(
                'Continuation questionnaire cannot point to the current one!')

    def __str__(self):
        return self.body
示例#29
0
文件: item.py 项目: jedie/PyInventory
class ItemLinkModel(BaseLink):
    item = models.ForeignKey(ItemModel, on_delete=models.CASCADE)

    def full_clean(self, **kwargs):
        if self.user_id is None:
            # inherit owner of this link from item instance
            self.user_id = self.item.user_id
        return super().full_clean(**kwargs)

    class Meta:
        verbose_name = _('ItemLinkModel.verbose_name')
        verbose_name_plural = _('ItemLinkModel.verbose_name_plural')
        ordering = ('position', )
示例#30
0
class IntegrationActivity(models.Model):
    integration = models.ForeignKey(Integration,
                                    on_delete=models.CASCADE,
                                    related_name='activities')
    event = models.ForeignKey(IntegrationEvent,
                              related_name='integration_activities')
    action = models.CharField(max_length=30, blank=True, null=True)
    url = models.URLField(blank=True, null=True)
    ref = models.CharField(max_length=30, blank=True, null=True)
    ref_name = models.CharField(max_length=50, blank=True, null=True)
    username = models.CharField(max_length=30, blank=True, null=True)
    fullname = models.CharField(max_length=50, blank=True, null=True)
    avatar_url = models.URLField(blank=True, null=True)
    title = models.CharField(max_length=200, blank=True, null=True)
    body = models.TextField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return '%s | ' % (self.integration, )

    class Meta:
        ordering = ['created_at']