def publish(json, publication_id, actor_membership_id, request_from): action = g.req('action', allowed=['load', 'validate', 'save']) publication = Publication.get(publication_id) actor_membership = MemberCompanyPortal.get(actor_membership_id) publisher_membership = MemberCompanyPortal.get_by_portal_id_company_id( publication.portal_division.portal_id, publication.material.company_id) if action == 'load': return publish_dialog_load(publication, publisher_membership) else: publish_dialog_save(publication, json['publication'], status=Publication.STATUSES['PUBLISHED']) if action == 'validate': publication.detach() return publication.validate(True) else: publication.save() utils.db.execute_function("tag_publication_set_position('%s', ARRAY ['%s']);" % (publication.id, "', '".join([t.id for t in publication.tags]))) actor_membership.NOTIFY_MATERIAL_ACTION_BY_COMPANY_OR_PORTAL( action='PUBLISH', material_title=publication.material.title, company_or_portal='company' if request_from == 'company_material_details' else 'portal') if request_from == 'company_material_details': return actor_membership.material_or_publication_grid_row(publication.material) elif request_from == 'portal_publications': return publication.portal_publication_grid_row(actor_membership)
def submit_or_publish_material(json, material_id): action = g.req('action', allowed=['load', 'validate', 'save']) publication = Publication(material=Material.get(material_id)) publisher_membership = MemberCompanyPortal.get(json['publisher_membership']['id']) employment = UserCompany.get_by_user_and_company_ids(company_id=publication.material.company_id) also_publish = json.get('also_publish', None) if action == 'load': return utils.dict_merge( publish_dialog_load(publication, publisher_membership), {'can_material_also_be_published': employment.rights[RIGHT_AT_COMPANY.ARTICLES_SUBMIT_OR_PUBLISH] and \ publisher_membership.rights[RIGHT_AT_PORTAL.PUBLICATION_PUBLISH] }) else: publish_dialog_save( publication, json['publication'], status=Publication.STATUSES['PUBLISHED'] if also_publish else Publication.STATUSES['SUBMITTED']) if action == 'validate': publication.detach() return publication.validate(True) else: publication.save() utils.db.execute_function("tag_publication_set_position('%s', ARRAY ['%s']);" % (publication.id, "', '".join([t.id for t in publication.tags]))) publisher_membership.NOTIFY_MATERIAL_ACTION_BY_COMPANY_OR_PORTAL( action='PUBLISH' if also_publish else 'SUBMIT', company_or_portal='company', material_title=publication.material.title) return publisher_membership.material_or_publication_grid_row(publication.material)
def get_portal_dict_for_material(portal, company, material=None, publication=None): ret = portal.get_client_side_dict( fields='id, name, host, logo_file_id, divisions.id|name|portal_division_type_id, own_company.name|id|logo_file_id') # ret['rights'] = MemberCompanyPortal.get(company_id=company_id, portal_id=ret['id']).rights ret['divisions'] = PRBase.get_ordered_dict([d for d in ret['divisions'] if ( d['portal_division_type_id'] == 'events' or d['portal_division_type_id'] == 'news')]) if material: publication_in_portal = db(ArticlePortalDivision).filter_by(article_company_id=material.id).filter( ArticlePortalDivision.portal_division_id.in_( [div_id for div_id, div in ret['divisions'].items()])).first() else: publication_in_portal = publication if publication_in_portal: ret['publication'] = publication_in_portal.get_client_side_dict( 'id,position,title,status,visibility,portal_division_id,publishing_tm') ret['publication']['division'] = ret['divisions'][ret['publication']['portal_division_id']] ret['publication']['counts'] = '0/0/0/0' ret['actions'] = publication_in_portal.actions(company) ret['publication']['actions'] = ret['actions'] else: ret['publication'] = None canbesubmited = material.actions(company)[ArticleCompany.ACTIONS['SUBMIT']] if canbesubmited is True: membership = MemberCompanyPortal.get(portal_id=portal.id, company_id=company.id) canbesubmited = membership.has_rights(MemberCompanyPortal.RIGHT_AT_PORTAL.PUBLICATION_PUBLISH) ret['actions'] = {ArticleCompany.ACTIONS['SUBMIT']: canbesubmited} return ret
def submit_publish(json, article_action): action = g.req('action', allowed=['load', 'validate', 'save']) company = Company.get(json['company']['id']) if article_action == 'SUBMIT': material = ArticleCompany.get(json['material']['id']) publication = ArticlePortalDivision(title=material.title, subtitle=material.subtitle, keywords=material.keywords, short=material.short, long=material.long, article_company_id=material.id) more_data_to_ret = { 'material': {'id': material.id}, 'can_material_also_be_published': MemberCompanyPortal.get(portal_id=json['portal']['id'], company_id=json['company']['id']) .has_rights(MemberCompanyPortal.RIGHT_AT_PORTAL.PUBLICATION_PUBLISH) } else: publication = ArticlePortalDivision.get(json['publication']['id']) more_data_to_ret = {} if action == 'load': ret = { 'publication': publication.get_client_side_dict(), 'company': company.get_client_side_dict(), 'portal': Portal.get(json['portal']['id']).get_client_side_dict() } ret['portal']['divisions'] = PRBase.get_ordered_dict([d for d in ret['portal']['divisions'] if (d['portal_division_type_id'] in ['events', 'news'])]) return PRBase.merge_dicts(ret, more_data_to_ret) else: publication.attr(g.filter_json(json['publication'], 'portal_division_id')) publication.publishing_tm = PRBase.parse_timestamp(json['publication'].get('publishing_tm')) publication.event_tm = PRBase.parse_timestamp(json['publication'].get('event_tm')) if 'also_publish' in json and json['also_publish']: publication.status = ArticlePortalDivision.STATUSES['PUBLISHED'] else: if article_action in [ArticlePortalDivision.ACTIONS['PUBLISH'], ArticlePortalDivision.ACTIONS['REPUBLISH']]: publication.status = ArticlePortalDivision.STATUSES['PUBLISHED'] elif article_action in [ArticlePortalDivision.ACTIONS['UNPUBLISH'], ArticlePortalDivision.ACTIONS[ 'UNDELETE']]: publication.status = ArticlePortalDivision.STATUSES['UNPUBLISHED'] elif article_action in [ArticlePortalDivision.ACTIONS['DELETE']]: publication.status = ArticlePortalDivision.STATUSES['DELETED'] if action == 'validate': publication.detach() return publication.validate(True if article_action == 'SUBMIT' else False) else: if article_action == 'SUBMIT': publication.long = material.clone_for_portal_images_and_replace_urls(publication.portal_division_id, publication) publication.save() return get_portal_dict_for_material(publication.portal, company, publication=publication)
def check(self, *args, **kwargs): from profapp.models.portal import Portal, MemberCompanyPortal if 'portal_id' in kwargs: portal = Portal.get(kwargs['portal_id']) elif 'membership_id' in kwargs: portal = MemberCompanyPortal.get(kwargs['membership_id']).portal else: raise Exception("No portal found by portal_id or membership_id kwargs={}".format(kwargs)) kwargs['company_id'] = portal.company_owner_id return super(EmployeeHasRightAtPortalOwnCompany, self).check(*args, **kwargs) and portal.is_active()
def get_portal_dict_for_material(portal, company, material=None, publication=None): ret = portal.get_client_side_dict( fields= 'id, name, host, logo_file_id, divisions.id|name|portal_division_type_id, own_company.name|id|logo_file_id' ) # ret['rights'] = MemberCompanyPortal.get(company_id=company_id, portal_id=ret['id']).rights ret['divisions'] = PRBase.get_ordered_dict([ d for d in ret['divisions'] if (d['portal_division_type_id'] == 'events' or d['portal_division_type_id'] == 'news') ]) if material: publication_in_portal = db(ArticlePortalDivision).filter_by( article_company_id=material.id).filter( ArticlePortalDivision.portal_division_id.in_([ div_id for div_id, div in ret['divisions'].items() ])).first() else: publication_in_portal = publication if publication_in_portal: ret['publication'] = publication_in_portal.get_client_side_dict( 'id,position,title,status,visibility,portal_division_id,publishing_tm' ) ret['publication']['division'] = ret['divisions'][ ret['publication']['portal_division_id']] ret['publication']['counts'] = '0/0/0/0' ret['actions'] = publication_in_portal.actions(company) ret['publication']['actions'] = ret['actions'] else: ret['publication'] = None canbesubmited = material.actions(company)[ ArticleCompany.ACTIONS['SUBMIT']] if canbesubmited is True: membership = MemberCompanyPortal.get(portal_id=portal.id, company_id=company.id) canbesubmited = membership.has_rights( MemberCompanyPortal.RIGHT_AT_PORTAL.PUBLICATION_PUBLISH) if not canbesubmited is True: canbesubmited = "Membership need right `{}` to perform action `{}`".format( MemberCompanyPortal.RIGHT_AT_PORTAL.PUBLICATION_PUBLISH, ArticleCompany.ACTIONS['SUBMIT']) ret['actions'] = {ArticleCompany.ACTIONS['SUBMIT']: canbesubmited} return ret
def check(self, membership_id): from profapp.models.portal import MemberCompanyPortal from profapp import utils membership = MemberCompanyPortal.get(membership_id) action = utils.find_by_keys(self.actions(membership), self._action, 'name') if not action: raise Exception("Unknown action {} for membership={}, publication={}".format( self._action, membership_id)) return action['enabled'] is True
def check(self, *args, **kwargs): from profapp.models.portal import Portal, MemberCompanyPortal if 'portal_id' in kwargs: portal = Portal.get(kwargs['portal_id']) elif 'membership_id' in kwargs: portal = MemberCompanyPortal.get(kwargs['membership_id']).portal else: raise Exception( "No portal found by portal_id or membership_id kwargs={}". format(kwargs)) kwargs['company_id'] = portal.company_owner_id return super(EmployeeHasRightAtPortalOwnCompany, self).check( *args, **kwargs) and portal.is_active()
def publish(json, publication_id, actor_membership_id, request_from): action = g.req('action', allowed=['load', 'validate', 'save']) publication = Publication.get(publication_id) actor_membership = MemberCompanyPortal.get(actor_membership_id) publisher_membership = MemberCompanyPortal.get_by_portal_id_company_id( publication.portal_division.portal_id, publication.material.company_id) if action == 'load': return publish_dialog_load(publication, publisher_membership) else: publish_dialog_save(publication, json['publication'], status=Publication.STATUSES['PUBLISHED']) if action == 'validate': publication.detach() return publication.validate(True) else: publication.save() utils.db.execute_function( "tag_publication_set_position('%s', ARRAY ['%s']);" % (publication.id, "', '".join([t.id for t in publication.tags]))) actor_membership.NOTIFY_MATERIAL_ACTION_BY_COMPANY_OR_PORTAL( action='PUBLISH', material_title=publication.material.title, company_or_portal='company' if request_from == 'company_material_details' else 'portal') if request_from == 'company_material_details': return actor_membership.material_or_publication_grid_row( publication.material) elif request_from == 'portal_publications': return publication.portal_publication_grid_row(actor_membership)
def check(self, membership_id): from profapp.models.portal import MemberCompanyPortal from profapp import utils membership = MemberCompanyPortal.get(membership_id) action = utils.find_by_keys(self.actions(membership), self._action, 'name') if not action: raise Exception( "Unknown action {} for membership={}, publication={}".format( self._action, membership_id)) return action['enabled'] is True
def publication_change_status(json, publication_id, actor_membership_id, action, request_from): actor_membership = MemberCompanyPortal.get(actor_membership_id) publication = Publication.get(publication_id) if action == ActionsForPublicationAtMembership.ACTIONS['UNPUBLISH']: publication.status = Publication.STATUSES['UNPUBLISHED'] elif action == ActionsForPublicationAtMembership.ACTIONS['UNDELETE']: publication.status = Publication.STATUSES['UNPUBLISHED'] elif action == ActionsForPublicationAtMembership.ACTIONS['DELETE']: publication.status = Publication.STATUSES['DELETED'] publication.save() actor_membership.NOTIFY_MATERIAL_ACTION_BY_COMPANY_OR_PORTAL( action=action, material_title=publication.material.title, company_or_portal='company' if request_from == 'company_material_details' else 'portal') if request_from == 'company_material_details': return actor_membership.material_or_publication_grid_row(publication.material) elif request_from == 'portal_publications': return publication.portal_publication_grid_row(actor_membership)
def article_actions_by_portal(cls, publication): from profapp.models.permissions import RIGHT_AT_COMPANY, RIGHT_AT_PORTAL from ..models.company import UserCompany from ..models.portal import MemberCompanyPortal from ..models.materials import Publication portal = publication.portal_division.portal employment = UserCompany.get_by_user_and_company_ids(company_id=portal.company_owner_id) membership = MemberCompanyPortal.get_by_portal_id_company_id( portal_id=portal.id, company_id=portal.company_owner_id) publish_rights = employment.rights[RIGHT_AT_COMPANY.ARTICLES_SUBMIT_OR_PUBLISH] and \ membership.rights[RIGHT_AT_PORTAL.PUBLICATION_PUBLISH] unpublish_rights = employment.rights[RIGHT_AT_COMPANY.ARTICLES_UNPUBLISH] and \ membership.rights[RIGHT_AT_PORTAL.PUBLICATION_UNPUBLISH] if publication.status == Publication.STATUSES['SUBMITTED']: ret = [ {'name': cls.ACTIONS['DELETE'], 'enabled': employment.rights[RIGHT_AT_COMPANY.ARTICLES_DELETE]}, ] elif publication.status == Publication.STATUSES['UNPUBLISHED']: ret = [ {'name': cls.ACTIONS['DELETE'], 'enabled': employment.rights[RIGHT_AT_COMPANY.ARTICLES_DELETE]}, {'name': cls.ACTIONS['PUBLISH'], 'enabled': publish_rights}, ] elif publication.status == Publication.STATUSES['PUBLISHED']: ret = [ {'name': cls.ACTIONS['UNPUBLISH'], 'enabled': unpublish_rights}, {'name': cls.ACTIONS['PUBLISH'], 'enabled': publish_rights and unpublish_rights}, ] elif publication.status == Publication.STATUSES['DELETED']: ret = [ {'name': cls.ACTIONS['UNDELETE'], 'enabled': unpublish_rights}, ] else: ret = [] for change in ret: change['message'] = '' return ret
def submit_or_publish_material(json, material_id): action = g.req('action', allowed=['load', 'validate', 'save']) publication = Publication(material=Material.get(material_id)) publisher_membership = MemberCompanyPortal.get( json['publisher_membership']['id']) employment = UserCompany.get_by_user_and_company_ids( company_id=publication.material.company_id) also_publish = json.get('also_publish', None) if action == 'load': return utils.dict_merge( publish_dialog_load(publication, publisher_membership), {'can_material_also_be_published': employment.rights[RIGHT_AT_COMPANY.ARTICLES_SUBMIT_OR_PUBLISH] and \ publisher_membership.rights[RIGHT_AT_PORTAL.PUBLICATION_PUBLISH] }) else: publish_dialog_save( publication, json['publication'], status=Publication.STATUSES['PUBLISHED'] if also_publish else Publication.STATUSES['SUBMITTED']) if action == 'validate': publication.detach() return publication.validate(True) else: publication.save() utils.db.execute_function( "tag_publication_set_position('%s', ARRAY ['%s']);" % (publication.id, "', '".join([t.id for t in publication.tags]))) publisher_membership.NOTIFY_MATERIAL_ACTION_BY_COMPANY_OR_PORTAL( action='PUBLISH' if also_publish else 'SUBMIT', company_or_portal='company', material_title=publication.material.title) return publisher_membership.material_or_publication_grid_row( publication.material)
def publication_change_status(json, publication_id, actor_membership_id, action, request_from): actor_membership = MemberCompanyPortal.get(actor_membership_id) publication = Publication.get(publication_id) if action == ActionsForPublicationAtMembership.ACTIONS['UNPUBLISH']: publication.status = Publication.STATUSES['UNPUBLISHED'] elif action == ActionsForPublicationAtMembership.ACTIONS['UNDELETE']: publication.status = Publication.STATUSES['UNPUBLISHED'] elif action == ActionsForPublicationAtMembership.ACTIONS['DELETE']: publication.status = Publication.STATUSES['DELETED'] publication.save() actor_membership.NOTIFY_MATERIAL_ACTION_BY_COMPANY_OR_PORTAL( action=action, material_title=publication.material.title, company_or_portal='company' if request_from == 'company_material_details' else 'portal') if request_from == 'company_material_details': return actor_membership.material_or_publication_grid_row( publication.material) elif request_from == 'portal_publications': return publication.portal_publication_grid_row(actor_membership)
def submit_publish(json, article_action): action = g.req('action', allowed=['load', 'validate', 'save']) company = Company.get(json['company']['id']) if article_action == 'SUBMIT': material = ArticleCompany.get(json['material']['id']) publication = ArticlePortalDivision(title=material.title, subtitle=material.subtitle, keywords=material.keywords, short=material.short, long=material.long, article_company_id=material.id) more_data_to_ret = { 'material': { 'id': material.id }, 'can_material_also_be_published': MemberCompanyPortal.get( portal_id=json['portal']['id'], company_id=json['company']['id']).has_rights( MemberCompanyPortal.RIGHT_AT_PORTAL.PUBLICATION_PUBLISH) } else: publication = ArticlePortalDivision.get(json['publication']['id']) more_data_to_ret = {} if action == 'load': ret = { 'publication': publication.get_client_side_dict(), 'company': company.get_client_side_dict(), 'portal': Portal.get(json['portal']['id']).get_client_side_dict() } ret['portal']['divisions'] = PRBase.get_ordered_dict([ d for d in ret['portal']['divisions'] if (d['portal_division_type_id'] in ['events', 'news']) ]) return PRBase.merge_dicts(ret, more_data_to_ret) else: publication.attr( g.filter_json(json['publication'], 'portal_division_id')) publication.publishing_tm = PRBase.parse_timestamp( json['publication'].get('publishing_tm')) publication.event_tm = PRBase.parse_timestamp( json['publication'].get('event_tm')) if 'also_publish' in json and json['also_publish']: publication.status = ArticlePortalDivision.STATUSES['PUBLISHED'] else: if article_action in [ ArticlePortalDivision.ACTIONS['PUBLISH'], ArticlePortalDivision.ACTIONS['REPUBLISH'] ]: publication.status = ArticlePortalDivision.STATUSES[ 'PUBLISHED'] elif article_action in [ ArticlePortalDivision.ACTIONS['UNPUBLISH'], ArticlePortalDivision.ACTIONS['UNDELETE'] ]: publication.status = ArticlePortalDivision.STATUSES[ 'UNPUBLISHED'] elif article_action in [ArticlePortalDivision.ACTIONS['DELETE']]: publication.status = ArticlePortalDivision.STATUSES['DELETED'] if action == 'validate': publication.detach() return publication.validate(True if article_action == 'SUBMIT' else False) else: if article_action == 'SUBMIT': publication.long = material.clone_for_portal_images_and_replace_urls( publication.portal_division_id, publication) publication.save() return get_portal_dict_for_material(publication.portal, company, publication=publication)
def article_actions_by_portal(cls, publication): from profapp.models.permissions import RIGHT_AT_COMPANY, RIGHT_AT_PORTAL from ..models.company import UserCompany from ..models.portal import MemberCompanyPortal from ..models.materials import Publication portal = publication.portal_division.portal employment = UserCompany.get_by_user_and_company_ids( company_id=portal.company_owner_id) membership = MemberCompanyPortal.get_by_portal_id_company_id( portal_id=portal.id, company_id=portal.company_owner_id) publish_rights = employment.rights[RIGHT_AT_COMPANY.ARTICLES_SUBMIT_OR_PUBLISH] and \ membership.rights[RIGHT_AT_PORTAL.PUBLICATION_PUBLISH] unpublish_rights = employment.rights[RIGHT_AT_COMPANY.ARTICLES_UNPUBLISH] and \ membership.rights[RIGHT_AT_PORTAL.PUBLICATION_UNPUBLISH] if publication.status == Publication.STATUSES['SUBMITTED']: ret = [ { 'name': cls.ACTIONS['DELETE'], 'enabled': employment.rights[RIGHT_AT_COMPANY.ARTICLES_DELETE] }, ] elif publication.status == Publication.STATUSES['UNPUBLISHED']: ret = [ { 'name': cls.ACTIONS['DELETE'], 'enabled': employment.rights[RIGHT_AT_COMPANY.ARTICLES_DELETE] }, { 'name': cls.ACTIONS['PUBLISH'], 'enabled': publish_rights }, ] elif publication.status == Publication.STATUSES['PUBLISHED']: ret = [ { 'name': cls.ACTIONS['UNPUBLISH'], 'enabled': unpublish_rights }, { 'name': cls.ACTIONS['PUBLISH'], 'enabled': publish_rights and unpublish_rights }, ] elif publication.status == Publication.STATUSES['DELETED']: ret = [ { 'name': cls.ACTIONS['UNDELETE'], 'enabled': unpublish_rights }, ] else: ret = [] for change in ret: change['message'] = '' return ret
def get_publisher_membership(self): from profapp.models.portal import MemberCompanyPortal return MemberCompanyPortal.get_by_portal_id_company_id( company_id=self.material.company_id, portal_id=self.portal_division.portal_id)