##############################################################################
#
# Copyright (c) 2002 Nexedi SARL and Contributors. All Rights Reserved.
#                    Jean-Paul Smets-Solanes <jp@nexedi.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# 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.
#
##############################################################################

from Products.ERP5Type.Utils import assertAttributePortalType
from AccessControl import ClassSecurityInfo
from Products.ERP5Type import Permissions, PropertySheet, Constraint, Interface
from Products.CMFCore.WorkflowCore import WorkflowMethod
from Products.CMFCore.utils import getToolByName

class Entity:
    """
        Mix-in class used by Organisation and Person

        Implements accessors to:

        - default_telephone

        - default_fax

        - default_email

        - default_address
    """

    # Declarative security
    security = ClassSecurityInfo()
    security.declareObjectProtected(Permissions.View)

    security.declareProtected(Permissions.View, 'getDefaultAddressText')
    def getDefaultAddressText(self):
        """
          Returns the default address as a text string
        """
        try:
          return self.getDefaultAddressValue().asText()
        except:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultAddressStreetAddress')
    def getDefaultAddressStreetAddress(self):
        """
          Returns the default address street as a text string
        """
        try:
          return self.getDefaultAddressValue().getStreetAddress()
        except:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultAddressCity')
    def getDefaultAddressCity(self):
        """
          Returns the default address city as a text string
        """
        try:
          return self.getDefaultAddressValue().getCity()
        except:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultCareerTitle')
    def getDefaultCareerTitle(self):
        """
          Returns the default address city as a text string
        """
        try:
          return self.getDefaultCareerValue().getTitle()
        except:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultCareerDestinationTitle')
    def getDefaultCareerDestinationTitle(self):
        """
          Returns the default address city as a text string
        """
        try:
          return self.getDefaultCareerValue().getDestinationTitle()
        except:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultCareerGrade')
    def getDefaultCareerGrade(self):
        """
          Returns the default address city as a text string
        """
        try:
          return self.getDefaultCareerValue().getGrade()
        except:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultCareerRole')
    def getDefaultCareerRole(self):
        """
          Returns the default address city as a text string
        """
        try:
          return self.getDefaultCareerValue().getRole()
        except:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultCareerActivity')
    def getDefaultCareerActivity(self):
        """
          Returns the default address city as a text string
        """
        try:
          return self.getDefaultCareerValue().getActivity()
        except:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultCareerFunction')
    def getDefaultCareerFunction(self):
        """
          Returns the default address city as a text string
        """
        try:
          return self.getDefaultCareerValue().getFunction()
        except:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultCareerGroup')
    def getDefaultCareerGroup(self):
        """
          Returns the default address city as a text string
        """
        try:
          return self.getDefaultCareerValue().getGroup()
        except:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultCareerProductLineList')
    def getDefaultCareerProductLineList(self):
        """
          Returns the default address city as a text string
        """
        try:
          return self.getDefaultCareerValue().getProductLineList()
        except:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultCareerSkillList')
    def getDefaultCareerSkillList(self):
        """
          Returns the default address city as a text string
        """
        try:
          return self.getDefaultCareerValue().getSkillList()
        except:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultCareerStartDate')
    def getDefaultCareerStartDate(self):
        """
          Returns the default address city as a text string
        """
        try:
          return self.getDefaultCareerValue().getStartDate()
        except:
          return None

    security.declareProtected(Permissions.View, 'getDefaultCareerStopDate')
    def getDefaultCareerStopDate(self):
        """
          Returns the default address city as a text string
        """
        try:
          return self.getDefaultCareerValue().getStopDate()
        except:
          return None

    security.declareProtected(Permissions.View, 'getDefaultCareerDescription')
    def getDefaultCareerDescription(self):
        """
          Returns the default address city as a text string
        """
        try:
          return self.getDefaultCareerValue().getDescription()
        except:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultCareerSalaryLevel')
    def getDefaultCareerSalaryLevel(self):
        """
          Returns the default address city as a text string
        """
        try:
          return self.getDefaultCareerValue().getSalaryLevel()
        except:
          return ''
        
    security.declareProtected(Permissions.View, 'getDefaultCareerSalaryCoefficient')
    def getDefaultCareerSalaryCoefficient(self):
        """
          Returns the default address city as a text string
        """
        try:
          return self.getDefaultCareerValue().getSalaryCoefficient()
        except:
          return ''                                                                               
        
    security.declareProtected(Permissions.View, 'getDefaultAddressRegion')
    def getDefaultAddressRegion(self):
        """
          Returns the default address region as a text string
        """
        try:
         return self.getDefaultAddressValue().getRegion()
        except:
         return ''

    security.declareProtected(Permissions.View, 'getDefaultAddressZipCode')
    def getDefaultAddressZipCode(self):
        """
          Returns the default address zip code as a text string
        """
        try:
          return self.getDefaultAddressValue().getZipCode()
        except:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultTelephoneText')
    def getDefaultTelephoneText(self):
        """
          Returns the default telephone as a text string
        """
        try:
          return self.getDefaultTelephone().asText()
        except:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultFaxText')
    def getDefaultFaxText(self):
        """
          Returns the default fax as a text string
        """
        try:
          return self.getDefaultFax().asText()
        except:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultEmailText')
    def getDefaultEmailText(self):
        """
          Returns the default email as a text string
        """
        try:
          return self.getDefaultEmail().asText()
        except:
          return ''

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultAddress')
    def setDefaultAddress(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultAddress(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultCareerTitle')
    def setDefaultCareerTitle(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultCareerTitle(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultCareerDescription')
    def setDefaultCareerDescription(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultCareerDescription(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultCareerGrade')
    def setDefaultCareerGrade(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultCareerGrade(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultCareerRole')
    def setDefaultCareerRole(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultCareerRole(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultCareerGroup')
    def setDefaultCareerGroup(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultCareerGroup(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultCareerActivity')
    def setDefaultCareerActivity(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultCareerActivity(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultCareerFunction')
    def setDefaultCareerFunction(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultCareerFunction(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultCareerSkillList')
    def setDefaultCareerSkillList(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultCareerSkillList(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultCareerProductLineList')
    def setDefaultCareerProductLineList(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultCareerProductLineList(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultCareerStartDate')
    def setDefaultCareerStartDate(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultCareerStartDate(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultCareerStopDate')
    def setDefaultCareerStopDate(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultCareerStopDate(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultCareerSalaryLevel')
    def setDefaultCareerSalaryLevel(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultCareerSalaryLevel(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultCareerSalaryCoefficient')
    def setDefaultCareerSalaryCoefficient(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultCareerSalaryCoefficient(coordinate)
        self.reindexObject()                                                    
                                                                                                        
    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultAddressText')
    def setDefaultAddressText(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultAddressText(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultAddressRegion')
    def setDefaultAddressRegion(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultAddressRegion(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultAddressCity')
    def setDefaultAddressCity(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultAddressCity(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultAddressZipCode')
    def setDefaultAddressZipCode(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultAddressZipCode(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultAddressStreetAddress')
    def setDefaultAddressStreetAddress(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultAddressStreetAddress(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultTelephoneText')
    def setDefaultTelephoneText(self, coordinate):
        """
          Updates the default telephone from a standard text string
        """
        self._setDefaultTelephoneText(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultFaxText')
    def setDefaultFaxText(self, coordinate):
        """
          Updates the default fax from a standard text string
        """
        self._setDefaultFaxText(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultEmailText')
    def setDefaultEmailText(self, coordinate):
        """
          Updates the default email from a standard text string
        """
        self._setDefaultEmailText(coordinate)
        self.reindexObject()

    ### Private methods - no reindexing
    security.declarePrivate('_setDefaultAddress')
    def _setDefaultAddress(self, coordinate):
        assertAttributePortalType(self, 'default_address', 'Address')
        if not hasattr(self,'default_address'):
          self.invokeFactory( type_name='Address'
                            , id='default_address'
                            )
        self.default_address = coordinate

    security.declarePrivate('_setDefaultAddressText')
    def _setDefaultAddressText(self, coordinate):
        assertAttributePortalType(self, 'default_address', 'Address')
        if not hasattr(self,'default_address'):
          self.invokeFactory( type_name='Address'
                            , id='default_address'
                            )
        self.default_address.fromText(coordinate)

    security.declarePrivate('_setDefaultAddressCity')
    def _setDefaultAddressCity(self, value):
        assertAttributePortalType(self, 'default_address', 'Address')
        if not hasattr(self,'default_address'):
          self.invokeFactory( type_name='Address'
                            , id='default_address'
                            )
        self.default_address.setCity(value)

    security.declarePrivate('_setDefaultAddressZipCode')
    def _setDefaultAddressZipCode(self, value):
        assertAttributePortalType(self, 'default_address', 'Address')
        if not hasattr(self,'default_address'):
          self.invokeFactory( type_name='Address'
                            , id='default_address'
                            )
        self.default_address.setZipCode(value)

    security.declarePrivate('_setDefaultAddressStreetAddress')
    def _setDefaultAddressStreetAddress(self, value):
        assertAttributePortalType(self, 'default_address', 'Address')
        if not hasattr(self,'default_address'):
          self.invokeFactory( type_name='Address'
                            , id='default_address'
                            )
        self.default_address.setStreetAddress(value)

    security.declarePrivate('_setDefaultAddressRegion')
    def _setDefaultAddressRegion(self, value):
        assertAttributePortalType(self, 'default_address', 'Address')
        if not hasattr(self,'default_address'):
          self.invokeFactory( type_name='Address'
                            , id='default_address'
                            )
        self.default_address.setRegion(value)

    security.declarePrivate('_setDefaultCareerTitle')
    def _setDefaultCareerTitle(self, coordinate):
        assertAttributePortalType(self, 'default_career', 'Career')
        if not hasattr(self,'default_career'):
          self.invokeFactory( type_name='Career'
                            , id='default_career'
                            )
        self.default_career.setTitle(coordinate)

    security.declarePrivate('_setDefaultCareerDescription')
    def _setDefaultCareerDescription(self, coordinate):
        assertAttributePortalType(self, 'default_career', 'Career')
        if not hasattr(self,'default_career'):
          self.invokeFactory( type_name='Career'
                            , id='default_career'
                            )
        self.default_career.setDescription(coordinate)

    security.declarePrivate('_setDefaultCareerGrade')
    def _setDefaultCareerGrade(self, coordinate):
        assertAttributePortalType(self, 'default_career', 'Career')
        if not hasattr(self,'default_career'):
          self.invokeFactory( type_name='Career'
                            , id='default_career'
                            )
        self.default_career.setGrade(coordinate)

    security.declarePrivate('_setDefaultCareerRole')
    def _setDefaultCareerRole(self, coordinate):
        assertAttributePortalType(self, 'default_career', 'Career')
        if not hasattr(self,'default_career'):
          self.invokeFactory( type_name='Career'
                            , id='default_career'
                            )
        self.default_career.setRole(coordinate)

    security.declarePrivate('_setDefaultCareerFunction')
    def _setDefaultCareerFunction(self, coordinate):
        assertAttributePortalType(self, 'default_career', 'Career')
        if not hasattr(self,'default_career'):
          self.invokeFactory( type_name='Career'
                            , id='default_career'
                            )
        self.default_career.setFunction(coordinate)

    security.declarePrivate('_setDefaultCareerActivity')
    def _setDefaultCareerActivity(self, coordinate):
        assertAttributePortalType(self, 'default_career', 'Career')
        if not hasattr(self,'default_career'):
          self.invokeFactory( type_name='Career'
                            , id='default_career'
                            )
        self.default_career.setActivity(coordinate)

    security.declarePrivate('_setDefaultCareerGroup')
    def _setDefaultCareerGroup(self, coordinate):
        assertAttributePortalType(self, 'default_career', 'Career')
        if not hasattr(self,'default_career'):
          self.invokeFactory( type_name='Career'
                            , id='default_career'
                            )
        self.default_career.setGroup(coordinate)

    security.declarePrivate('_setDefaultCareerProductLineList')
    def _setDefaultCareerProductLineList(self, coordinate):
        assertAttributePortalType(self, 'default_career', 'Career')
        if not hasattr(self,'default_career'):
          self.invokeFactory( type_name='Career'
                            , id='default_career'
                            )
        self.default_career.setProductLineList(coordinate)

    security.declarePrivate('_setDefaultCareerSkillList')
    def _setDefaultCareerSkillList(self, coordinate):
        assertAttributePortalType(self, 'default_career', 'Career')
        if not hasattr(self,'default_career'):
          self.invokeFactory( type_name='Career'
                            , id='default_career'
                            )
        self.default_career.setSkillList(coordinate)

    security.declarePrivate('_setDefaultCareerStartDate')
    def _setDefaultCareerStartDate(self, coordinate):
        assertAttributePortalType(self, 'default_career', 'Career')
        if not hasattr(self,'default_career'):
          self.invokeFactory( type_name='Career'
                            , id='default_career'
                            )
        self.default_career.setStartDate(coordinate)

    security.declarePrivate('_setDefaultCareerStopDate')
    def _setDefaultCareerStopDate(self, coordinate):
        assertAttributePortalType(self, 'default_career', 'Career')
        if not hasattr(self,'default_career'):
          self.invokeFactory( type_name='Career'
                            , id='default_career'
                            )
        self.default_career.setStopDate(coordinate)

    security.declarePrivate('_setDefaultCareerSalaryLevel')
    def _setDefaultCareerSalaryLevel(self, coordinate):
        assertAttributePortalType(self, 'default_career', 'Career')
        if not hasattr(self,'default_career'):
          self.invokeFactory( type_name='Career'
                            , id='default_career'
                            )
        self.default_career.setSalaryLevel(coordinate)
                                              
    security.declarePrivate('_setDefaultCareerSalaryCoefficient')
    def _setDefaultCareerSalaryCoefficient(self, coordinate):
        assertAttributePortalType(self, 'default_career', 'Career')
        if not hasattr(self,'default_career'):
          self.invokeFactory( type_name='Career'
                            , id='default_career'
                            )
        self.default_career.setSalaryCoefficient(coordinate)
                                            
    security.declarePrivate('_setDefaultTelephoneText')
    def _setDefaultTelephoneText(self, coordinate):
        assertAttributePortalType(self, 'default_telephone', 'Telephone')
        if not hasattr(self,'default_telephone'):
          self.invokeFactory( type_name='Telephone'
                            , id='default_telephone'
                            )
        self.default_telephone.fromText(coordinate)

    security.declarePrivate('_setDefaultFaxText')
    def _setDefaultFaxText(self, coordinate):
        assertAttributePortalType(self, 'default_fax', 'Fax')
        if not hasattr(self,'default_fax'):
          self.invokeFactory( type_name='Fax'
                            , id='default_fax'
                            )
        self.default_fax.fromText(coordinate)

    security.declarePrivate('_setDefaultEmailText')
    def _setDefaultEmailText(self, coordinate):
        assertAttributePortalType(self, 'default_email', 'Email')
        if not hasattr(self,'default_email'):
          self.invokeFactory( type_name='Email'
                            , id='default_email'
                            )
        self.default_email.fromText(coordinate)

    security.declareProtected(Permissions.ModifyPortalContent, 'validate')
    def validate(self):
      """
        Sets the entity to validated
      """
      pass

    validate = WorkflowMethod(validate)

    security.declareProtected(Permissions.ModifyPortalContent, 'invalidate')
    def invalidate(self):
      """
        Sets the entity to invalidated
      """
      pass

    invalidate = WorkflowMethod(invalidate)

    security.declareProtected(Permissions.AccessContentsInformation, 'getValidationState')
    def getValidationState(self, id_only=1):
      """
        Returns the current state in validation
      """
      portal_workflow = getToolByName(self, 'portal_workflow')
      wf = portal_workflow.getWorkflowById('validation_workflow')
      return wf._getWorkflowStateOf(self, id_only=id_only )