##
## 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 zope.component.interfaces import IFactory
from zope.interface import implementedBy
from zope.schema.fieldproperty import FieldProperty
from waeup.sirp.interfaces import IWAeUPSIRPPluggable
from waeup.sirp.applicants.interfaces import (
    IResultEntry, IApplicant, IApplicantPDEEditData,
    DEFAULT_PASSPORT_IMAGE_MALE,
    )

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

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

class Applicant(grok.Context):
    grok.implements(IApplicant, IApplicantPDEEditData)
    grok.provides(IApplicant)

# 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.
for field_name in list(IApplicant):
    setattr(Applicant, field_name, FieldProperty(IApplicant[field_name]))

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)
