taskapp/models.py
author nishanth
Sat, 27 Feb 2010 10:48:43 +0530
changeset 128 f34e3a3e1439
parent 124 6d92b7cd2a37
child 129 e747da8bc110
permissions -rw-r--r--
modified the notifications model. the sent_to is now a foreign key. now if we have a new type to be added, we can generate message and sub while creating notification. we can keep track of history using the role field in notification and task/sent_from

import os

from django.core.files.storage import FileSystemStorage
from django.db import models
from django.contrib.auth.models import User

import tagging
from tagging.fields import TagField

from pytask.taskapp.utilities.helper import get_key

GENDER_CHOICES = (( 'M', 'Male'), ('F', 'Female'))
RIGHTS_CHOICES = (
	("AD", "Admin"),
	("MG", "Manager"),
	("DV", "Developer"),
	("CT", "Contributor"),)

STATUS_CHOICES = (
    ("UP", "Unpublished"),
    ("OP", "Open"),
    ("LO", "Locked"),
    ("WR", "Working"),
    ("CD", "Closed"),
    ("DL", "Deleted"),
    ("CM", "Completed"))

NOTIFY_CHOICES = (
    ("MT", "Add Mentor"),
    ("DV", "Developer"),
    ("MG", "Manager"),
    ("AD", "Admin"),
    ("PY", "Assign credits"),
    ("CM", "Task completed"),
    ("CD", "Task closed"),
    ("DL", "Task deleted"),
    ("KD", "Kicked off"),
    ("MS", "Message"),
)


IMAGES_DIR = "./images"
UPLOADS_DIR = "./uploads"


class CustomImageStorage(FileSystemStorage):

    def path(self, name):
        """ we return images directory path.
        """

        return os.path.join(IMAGES_DIR, name)

    def get_available_name(self, name):
        """ here we are going with username as the name of image.
        """
    
        root, ext = os.path.splitext(name)
        file_name = get_key() + ext
        while self.exists(file_name):
            file_name = get_key() + ext
        return file_name

class Profile(models.Model):
    
    user = models.ForeignKey(User, unique = True)
    dob = models.DateField(verbose_name = u"Date of Birth", help_text = "YYYY-MM-DD")
    gender = models.CharField(max_length = 1, choices = GENDER_CHOICES)
    rights = models.CharField(max_length = 2, choices = RIGHTS_CHOICES, default = u"CT")
    credits = models.PositiveSmallIntegerField(default = 0)
    
    aboutme = models.TextField(blank = True)
    foss_comm = TagField()
    phonenum = models.CharField(max_length = 15, blank = True, verbose_name = u"Phone Number")
    homepage = models.URLField(blank = True, verbose_name = u"Homepage/Blog")
    street = models.CharField(max_length = 80, blank = True)
    city = models.CharField(max_length = 25, blank = True)
    country = models.CharField(max_length = 25, blank = True)
    nick = models.CharField(max_length = 20, blank = True)
    photo = models.ImageField(storage = CustomImageStorage(),upload_to = IMAGES_DIR, blank = True)

    def __unicode__(self):
        return unicode(self.user.username)


class Task(models.Model):
    
    prim_key = models.AutoField(primary_key = True)
    id = models.CharField(max_length = 10, unique = True)
    title = models.CharField(max_length = 100, unique = True, verbose_name = u"Title", help_text = u"Keep it simple and below 100 chars.")
    desc = models.TextField(verbose_name = u"Description")
    status = models.CharField(max_length = 2, choices = STATUS_CHOICES, default = "UP")
    tags_field = TagField()
    
    credits = models.PositiveSmallIntegerField()
    progress = models.PositiveSmallIntegerField(default = 0)
        
    mentors = models.ManyToManyField(User, related_name = "%(class)s_mentors")
    created_by = models.ForeignKey(User, related_name = "%(class)s_created_by")
    claimed_users = models.ManyToManyField(User, blank = True, related_name = "%(class)s_claimed_users")
    assigned_users = models.ManyToManyField(User, blank = True, related_name = "%(class)s_assigned_users")
    
    creation_datetime = models.DateTimeField()
    published_datetime = models.DateTimeField()
    sub_type = models.CharField(max_length=1, choices = (('D','Dependency'),('S','Subtask')), default = 'D')   
    
    def __unicode__(self):
        return unicode(self.title)

class Map(models.Model):

    main = models.ForeignKey('Task', related_name = "%(class)s_main")
    subs = models.ManyToManyField('Task', blank = True, null = True, related_name = "%(class)s_subs")


class Comment(models.Model):
    
    task = models.ForeignKey('Task')
    data = models.TextField()
    created_by = models.ForeignKey(User, related_name = "%(class)s_created_by")
    creation_datetime = models.DateTimeField()
    deleted_by = models.ForeignKey(User, null = True, blank = True, related_name = "%(class)s_deleted_by")
    is_deleted = models.BooleanField()
    attachment = models.FileField(upload_to = UPLOADS_DIR, blank = True)
    
    def __unicode__(self):
        return unicode(self.task.title)

class Credit(models.Model):
    
    task = models.ForeignKey('Task')
    given_by = models.ForeignKey(User, related_name = "%(class)s_given_by")
    given_to = models.ForeignKey(User, related_name = "%(class)s_given_to")
    points = models.PositiveSmallIntegerField()
    given_time = models.DateTimeField()
    
    def __unicode__(self):
        return unicode(self.task.title)
        
class Claim(models.Model):
    
    task = models.ForeignKey('Task')
    user = models.ForeignKey(User)
    message = models.TextField()
    creation_datetime = models.DateTimeField()

class Request(models.Model):

    sent_to = models.ManyToManyField(User, related_name = "%(class)s_sent_to", blank = False)
    sent_by = models.ForeignKey(User, related_name = "%(class)s_sent_by", blank = False)
    role = models.CharField(max_length = 2, blank = False)
    reply = models.BooleanField(default = False, blank = False)
    remarks = models.TextField(default = "",blank = True)
    
    is_read = models.BooleanField(default = False, blank = False)
    is_valid = models.BooleanField(default = True, blank = False)
    
    creation_date = models.DateTimeField()
    reply_date = models.DateTimeField()
    is_replied = models.BooleanField(default = False)
    replied_by = models.ForeignKey(User, related_name = "%(class)s_replied_by", blank = True, null = True)
    
    task = models.ForeignKey(Task,related_name = "%(class)s_task", blank = True, null = True)
    receiving_user = models.ForeignKey(User, related_name = "%(class)s_receiving_user", blank = True, null = True)
    pynts = models.PositiveIntegerField(default=0)

    def __unicode__(self):

        return u"Request %s %s"%(self.sent_by.username, self.role)

class Notification(models.Model):

    role = models.CharField(max_length = 2, choices = NOTIFY_CHOICES, blank = False)
    sent_to = models.ForeignKey(User, related_name = "%(class)s_sent_to", blank = False)
    sent_from = models.ForeignKey(User, related_name = "%(class)s_sent_from", blank = True)
    task = models.ForeignKey(Task, related_name = "%(class)s_sent_for", blank = False)


    sub = models.CharField(max_length = 100)
    message = models.TextField()
    remark = models.CharField(max_length = 100)

    sent_date = models.DateTimeField()
    is_read = models.BooleanField(default = False)
    is_deleted = models.BooleanField(default = False)
    
tagging.register(Profile)
tagging.register(Task)