示例#1
0
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)
示例#2
0
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)
示例#3
0
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
示例#4
0
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)
示例#5
0
    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()
示例#6
0
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
示例#7
0
    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
示例#8
0
    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()
示例#9
0
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)
示例#10
0
    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
示例#11
0
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)
示例#12
0
    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
示例#13
0
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)
示例#14
0
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)
示例#15
0
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)
示例#16
0
    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
示例#17
0
 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)