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
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
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
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
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
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')
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())
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')
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
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
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')
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']
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())
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
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
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)
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']
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
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')
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
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
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
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', )
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']