"""
"""
from django.db import models
from django.conf import settings
from django.contrib.auth.models import User, AnonymousUser, Group
from django.core.validators import ValidationError, lazy_inter
from django.utils.translation import ugettext_lazy as _
from django.db.models import Q
from pycon.tags.fields import MultiWordTagField
from pycon.core import *
from datetime import datetime
from django.core.cache import cache
from pycon.restructuredtext.validators import IsValidReST

from django.core.urlresolvers import reverse


POSTERS_GROUP = None

POSTER_STATUS_CHOICES = Choices([
    ('R', 'Under Review'),
    ('A', 'Accepted'),
    ('D', 'Declined'),
    ('C', 'Canceled'),
    ('W', 'Withdrawn'),
])


class Poster(models.Model):
    """
    """
    title       = models.CharField(maxlength=180, unique=True,
                                   null=False, blank=False)
    summary     = models.TextField(blank=False)
    description = models.TextField(null=False, blank=False,
                    validator_list=[IsValidReST(
                        "Invalid ReST Markup (see error above): ", True)])

    virtual     = models.BooleanField(help_text="Is this a virtual poster?",
                                      null=False, blank=False, default=False)
    author      = models.ForeignKey(User, related_name='poster_submitted_set')
    status      = models.CharField(maxlength=1, null=False, blank=False,
                                   choices=POSTER_STATUS_CHOICES,
                                   default=POSTER_STATUS_CHOICES.default)
    submitted   = models.DateTimeField("submitted on", auto_now_add=True)
    updated     = models.DateTimeField("last updated on", auto_now=True)

    class Meta:
        permissions = (
            ("can_view_all_posters",    "Can view all posters"),)
        ordering = ('id',)

    class Admin:
        list_display  = ('id', 'title', 'author', 'status',
                         'submitted', 'updated')
        list_display_links = ('id', 'title')
        date_hierarchy = 'submitted'
        list_filter   = ('status', 'submitted', 'updated')
        search_fields = ('title', 'summary', 'description')

    def __unicode__(self):
        return (u'P%d. ' % self.id) + self.title

    def get_absolute_url(self):
        return reverse('poster-view', None, (), {'pid': str(self.id)})

    def save(self):
        global POSTERS_GROUP
        isnew = self.id == None
        res = super(Poster, self).save()
        if POSTERS_GROUP is None:
            POSTERS_GROUP = Group.objects.get(name='Posters')
        if isnew:
            self.author.groups.add(POSTERS_GROUP)
            self.author.save()
        return res

class AttachedFile(models.Model):
    """
    """
    poster  = models.ForeignKey(Poster,
                                  #edit_inline=models.TABULAR,
                                  num_in_admin=3)
    submitter = models.ForeignKey(User, core=True, related_name='poster_attachment_set')
    submitted = models.DateTimeField("uploaded on", auto_now_add=True)
    file      = models.FileField(upload_to=settings.POSTER_UPLOAD_TO)
    comment   = models.CharField(maxlength=100)

    class Admin:
        list_display = ('get_file_short_name', 'poster',
                        'submitter', 'submitted')
        list_filter = ('submitter', 'poster', 'submitted')
        date_hierarchy = 'submitted'
        search_fields = ('poster', 'comment')

    class Meta:
        ordering = ('submitted',)

    @short_description("name")
    def get_file_short_name(self):
        return self.file.replace("\\", "/").split("/")[-1]

    def __unicode__(self):
        return unicode(self.file)


class Comment(models.Model):
    """
    """
    poster  = models.ForeignKey(Poster)
    submitted = models.DateTimeField("submitted on", auto_now_add=True)
    commenter = models.ForeignKey(User, core=True, related_name='poster_comment_set')
    comment   = models.TextField(validator_list=[IsValidReST(
                    "Invalid ReST Markup (see inline error above): ", True)])

    class Admin:
        list_display = ('poster', 'commenter', 'submitted')
        list_display_links = ('poster',)
        list_filter = ('commenter', 'poster', 'submitted')
        date_hierarchy = 'submitted'
        search_fields = ('poster', 'comment')
    class Meta:
        ordering = ('submitted',)

    def __unicode__(self):
        return u"Comment by: " + unicode(self.commenter)
