Source code for highton.models.deal

from copy import deepcopy
from highton import (
    fields,
    call_mixins,
)
from highton.highton_constants import HightonConstants
from highton.models import HightonModel


[docs]class Deal( HightonModel, call_mixins.CreateCallMixin, call_mixins.UpdateCallMixin, call_mixins.DetailCallMixin, call_mixins.ListCallMixin, call_mixins.DeleteCallMixin, call_mixins.ListNoteCallMixin, call_mixins.ListEmailCallMixin, call_mixins.ListTagCallMixin, call_mixins.CreateTagCallMixin, call_mixins.DeleteTagCallMixin, call_mixins.ListTaskCallMixin, call_mixins.CreateNoteCallMixin, ): """ A deal which represents: https://github.com/basecamp/highrise-api/blob/master/sections/deals.md :ivar id: fields.IntegerField(name=HightonConstants.ID) :ivar author_id: fields.IntegerField(name=HightonConstants.AUTHOR_ID) :ivar account_id: fields.IntegerField(name=HightonConstants.ACCOUNT_ID) :ivar background: fields.StringField(name=HightonConstants.BACKGROUND) :ivar category_id: fields.IntegerField(name=HightonConstants.CATEGORY_ID) :ivar created_at: fields.DatetimeField(name=HightonConstants.CREATED_AT) :ivar currency: fields.StringField(name=HightonConstants.CURRENCY) :ivar duration: fields.IntegerField(name=HightonConstants.DURATION) :ivar group_id: fields.IntegerField(name=HightonConstants.GROUP_ID) :ivar name: fields.StringField(name=HightonConstants.NAME) :ivar owner_id: fields.IntegerField(name=HightonConstants.OWNER_ID) :ivar party_id: fields.IntegerField(name=HightonConstants.PARTY_ID) :ivar price: fields.IntegerField(name=HightonConstants.PRICE) :ivar price_type: fields.StringField(name=HightonConstants.PRICE_TYPE) :ivar responsible_party_id: fields.IntegerField(name=HightonConstants.RESPONSIBLE_PARTY_ID) :ivar status: fields.StringField(name=HightonConstants.STATUS) :ivar status_changed_on: fields.DateField(name=HightonConstants.STATUS_CHANGED_ON) :ivar updated_at: fields.DatetimeField(name=HightonConstants.UPDATED_AT) :ivar visible_to: fields.StringField(name=HightonConstants.VISIBLE_TO) :ivar party: fields.ObjectField(name=HightonConstants.PARTY, init_class=Party) :ivar category: fields.ObjectField(name=HightonConstants.CATEGORY, init_class=Category) :ivar tags: fields.ListField(name=HightonConstants.TAGS, init_class=Tag) :ivar parties: fields.ListField(name=HightonConstants.PARTIES, init_class=Party) :ivar contact_data: fields.ObjectField(name=HightonConstants.CONTACT_DATA, init_class=ContactData) :ivar subject_datas: fields.ListField(name=HightonConstants.SUBJECT_DATAS, init_class=SubjectData) :ivar associated_parties: fields.ListField(name=HightonConstants.ASSOCIATED_PARTIES, init_class=AssociatedParty) """ ENDPOINT = HightonConstants.DEALS TAG_NAME = HightonConstants.DEAL OFFSET = 500 def __init__(self, **kwargs): """ Init a deal with the attributes :param kwargs: :type kwargs: """ from highton.models import ( Tag, ContactData, SubjectData, Party, AssociatedParty, Category, ) self.author_id = fields.IntegerField(name=HightonConstants.AUTHOR_ID) self.account_id = fields.IntegerField(name=HightonConstants.ACCOUNT_ID) self.background = fields.StringField(name=HightonConstants.BACKGROUND) self.category_id = fields.IntegerField(name=HightonConstants.CATEGORY_ID) self.created_at = fields.DatetimeField(name=HightonConstants.CREATED_AT) self.currency = fields.StringField(name=HightonConstants.CURRENCY) self.duration = fields.IntegerField(name=HightonConstants.DURATION) self.group_id = fields.IntegerField(name=HightonConstants.GROUP_ID) self.name = fields.StringField(name=HightonConstants.NAME) self.owner_id = fields.IntegerField(name=HightonConstants.OWNER_ID) self.party_id = fields.IntegerField(name=HightonConstants.PARTY_ID) self.price = fields.IntegerField(name=HightonConstants.PRICE) self.price_type = fields.StringField(name=HightonConstants.PRICE_TYPE) self.responsible_party_id = fields.IntegerField(name=HightonConstants.RESPONSIBLE_PARTY_ID) self.status = fields.StringField(name=HightonConstants.STATUS) self.status_changed_on = fields.DatetimeField(name=HightonConstants.STATUS_CHANGED_ON) self.updated_at = fields.DatetimeField(name=HightonConstants.UPDATED_AT) self.visible_to = fields.StringField(name=HightonConstants.VISIBLE_TO) self.party = fields.ObjectField(name=HightonConstants.PARTY, init_class=Party) self.category = fields.ObjectField(name=HightonConstants.CATEGORY, init_class=Category) self.tags = fields.ListField(name=HightonConstants.TAGS, init_class=Tag) self.parties = fields.ListField(name=HightonConstants.PARTIES, init_class=Party) self.contact_data = fields.ObjectField(name=HightonConstants.CONTACT_DATA, init_class=ContactData) self.subject_datas = fields.ListField(name=HightonConstants.SUBJECT_DATAS, init_class=SubjectData) self.associated_parties = fields.ListField(name=HightonConstants.ASSOCIATED_PARTIES, init_class=AssociatedParty) super().__init__(**kwargs)
[docs] @classmethod def list(cls, page=0, status=None, since=None): """ :param page: page starting by 0 :type page: int :param since: :type since: datetime.datetime :param status: :type status: str :return: list of person objects :rtype: list """ params = {} if page: params['n'] = int(page) * cls.OFFSET if since: params['since'] = since.strftime(cls.COLLECTION_DATETIME) if status: params['status'] = status return super().list(params)
[docs] def update(self): this = deepcopy(self) # remove all resolved fields because Highrise wont proceed them del this.party del this.parties del this.associated_parties del this.category self._put_request( data=this.element_to_string( this.encode() ), endpoint=this.ENDPOINT + '/' + str(this.id) )
[docs] def update_status(self, status): """ Updates the status of the deal :param status: status have to be ('won', 'pending', 'lost') :return: successfull response or raise Exception :rtype: """ assert (status in (HightonConstants.WON, HightonConstants.PENDING, HightonConstants.LOST)) from highton.models import Status status_obj = Status(name=status) return self._put_request( data=status_obj.element_to_string(status_obj.encode()), endpoint=self.ENDPOINT + '/' + str(self.id) + '/status', )