##
## applicants.py
## Login : <uli@pu.smp.net>
## Started on  Fri Jul 16 11:46:55 2010 Uli Fouquet
## $Id$
## 
## Copyright (C) 2010 Uli Fouquet
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
## 
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
## 
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##
import grok
from grok import index
from datetime import datetime
from zope.component.interfaces import IFactory
from zope.interface import implementedBy
from zope.schema.fieldproperty import FieldProperty
from hurry.workflow.interfaces import IWorkflowInfo, IWorkflowState
from waeup.sirp.interfaces import IWAeUPSIRPPluggable
from waeup.sirp.app import University
from waeup.sirp.applicants.interfaces import (
    IResultEntry, IApplicant, IApplicantEdit,
    DEFAULT_PASSPORT_IMAGE_MALE,
    )
from waeup.sirp.utils.helpers import attrs_to_fields

class ResultEntry(grok.Context):
    grok.implements(IResultEntry)

    def __init__(self, subject=None, score=None):
        self.subject = subject
        self.score = score

class Applicant(grok.Model):
    grok.implements(IApplicant,IApplicantEdit)
    grok.provides(IApplicant)

    def __init__(self):
        super(Applicant, self).__init__()
        #Initialize workflow state...
        IWorkflowInfo(self).fireTransition('init')
        timestamp = datetime.now().strftime("%d/%m/%Y %H:%M")
        self.messages = u'%s - Initialize application' % timestamp

# Set all attributes of Applicant required in IApplicant as field
# properties. Doing this, we do not have to set initial attributes
# ourselves and as a bonus we get free validation when an attribute is
# set.
Applicant = attrs_to_fields(Applicant)

class ApplicantCatalog(grok.Indexes):
    """A catalog indexing :class:`Applicant` instances in the ZODB.
    """
    grok.site(University)
    grok.name('applicants_catalog')
    grok.context(IApplicant)

    access_code = index.Field(attribute='access_code')

class ApplicantTraverser(grok.Traverser):
    """Get image of the context applicant.

    Each applicant can provide a passport photograph which will be
    returned by this traverser if:

    - we request the exact filename of the picture or

    - ask for a picture named 'passport.jpg'.

    If no picture was stored yet, we get a placeholder image when
    asking for `passport.jpg`.

    If none of the above applies, we return ``None``, most probably
    resulting a :exc:`NotFound` exception.

    """
    grok.context(IApplicant)
    def traverse(self, name):
        passport_filename = getattr(self.context.passport, 'filename', None)
        if name == passport_filename:
            return self.context.passport
        if name == 'passport.jpg':
            if self.context.passport is not None:
                return self.context.passport
            return DEFAULT_PASSPORT_IMAGE_MALE
        return

class ApplicantFactory(grok.GlobalUtility):
    """A factory for faculty containers.
    """
    grok.implements(IFactory)
    grok.name(u'waeup.Applicant')
    title = u"Create a new applicant.",
    description = u"This factory instantiates new applicant instances."

    def __call__(self, *args, **kw):
        return Applicant()

    def getInterfaces(self):
        return implementedBy(Applicant)
