Пример #1
0
    def default_data(self):
        root = self.request.root
        template = getattr(root, 'proposal_template', None)
        text = '<p>{idea_text}</p>'
        if template:
            try:
                text = template.fp.readall().decode()
            except Exception as error:
                log.warning(error)

        localizer = self.request.localizer
        title = self.context.title + \
            localizer.translate(_(" (the proposal)"))
        data = {'title': title,
                'description': self.context.text,
                'text': text.format(
                    idea_text=self.context.text.replace('\n', '<br/>')),
                'keywords': self.context.keywords,
                'related_ideas': [self.context]}
        attached_files = self.context.attached_files
        data['add_files'] = {'attached_files': []}
        files = []
        for file_ in attached_files:
            file_data = add_file_data(file_)
            if file_data:
                files.append(file_data)

        if files:
            data['add_files']['attached_files'] = files

        challenge = getattr(self.context, 'challenge', None)
        if challenge and challenge.can_add_content:
            data['challenge'] = challenge

        return data
Пример #2
0
            def send_notification(players_ids, excluded_ids=[]):
                subject = subjects[0] if subjects else sender
                request = get_current_request()
                user = get_current(request)
                notification_data = alert_class.get_notification_data(
                    subject, user, request, alert)
                header = {
                    "Content-Type": "application/json",
                    "authorization": "Basic " + app_key}
                payload = {"app_id": app_id,
                           "headings": {"en": notification_data['title'],
                                        "fr": notification_data['title']},
                           "contents": {"en": notification_data['message'],
                                        "fr": notification_data['message']},
                           "url": notification_data['url']
                           }
                if players_ids != 'all':
                    payload["include_player_ids"] = players_ids
                else:
                    payload["included_segments"] = ['All']

                # if excluded_ids:
                #     payload["excluded_player_ids"] = excluded_ids

                try:
                    requests.post(
                        "https://onesignal.com/api/v1/notifications",
                        headers=header, data=json.dumps(payload), timeout=0.1)
                except Exception as error:
                    log.warning(error)
Пример #3
0
    def __call__(self):
        is_homepage = self.request.view_name in ('index', '')
        if not is_homepage or 'challenge' not in self.request.content_to_manage:
            return {'condition': False}

        challenges_view = SeeChallengesHomeView(self.context, self.request)
        try:
            challenges_view_result = challenges_view()
            if getattr(challenges_view, 'no_challenges', False):
                return {'condition': False}

        except Exception as error:
            log.warning(error)
            return {'condition': False}

        challenges = ''
        result = {'condition': True, 'css_links': [], 'js_links': []}
        if isinstance(challenges_view_result, dict) and \
           'coordinates' in challenges_view_result:
            search_render = challenges_view_result['coordinates'][challenges_view.coordinates][0]
            result['css_links'] = [c for c in challenges_view_result['css_links']
                                   if c not in resources['css_links']]
            result['js_links'] = [c for c in challenges_view_result['js_links']
                                  if c not in resources['js_links']]
            challenges = challenges_view.render_item(
                search_render,
                challenges_view.coordinates,
                None)

        result['challenges'] = challenges
        result['view'] = self
        update_resources(self.request, result)
        return result
Пример #4
0
    def default_data(self):
        root = self.request.root
        template = getattr(root, 'proposal_template', None)
        text = '<p>{idea_text}</p>'
        if template:
            try:
                text = template.fp.readall().decode()
            except Exception as error:
                log.warning(error)

        localizer = self.request.localizer
        title = self.context.title + \
            localizer.translate(_(" (the proposal)"))
        data = {'title': title,
                'description': self.context.text,
                'text': text.format(
                    idea_text=self.context.text.replace('\n', '<br/>')),
                'tree': self.context.tree,
                'related_ideas': [self.context]}
        attached_files = self.context.attached_files
        data['add_files'] = {'attached_files': []}
        files = []
        for file_ in attached_files:
            file_data = add_file_data(file_)
            if file_data:
                files.append(file_data)

        if files:
            data['add_files']['attached_files'] = files

        challenge = getattr(self.context, 'challenge', None)
        if challenge and challenge.can_add_content:
            data['challenge'] = challenge

        return data
Пример #5
0
    def update(self):
        comment_id = self.params('comment_id')
        user = get_current()
        comment = None
        try:
            obj = get_obj(int(comment_id)) if comment_id else None
            if isinstance(obj, Comment) and can_access(user, obj):
                comment = obj
        except Exception as error:
            log.warning(error)

        comment_body = ''
        if comment:
            comment_body = render_listing_obj(
                self.request, comment, user)

        values = {
            'comment_body': comment_body
        }
        result = {}
        body = self.content(
            args=values, template=self.template)['body']
        item = self.adapt_item(body, self.viewid)
        result['coordinates'] = {self.coordinates: [item]}
        result = merge_dicts(self.requirements_copy, result)
        return result
Пример #6
0
    def __call__(self, has_admin_nav=False):
        result = {
            'condition': False
        }
        if self.request.user:
            channels_view = SeeChannels(self.context, self.request)
            try:
                channels_view_result = channels_view()
            except Exception as error:
                log.warning(error)
                return {'condition': False}

            channels = ''
            result = {
                'condition': True, 'css_links': [],
                'js_links': [], 'has_admin_nav':has_admin_nav}
            if isinstance(channels_view_result, dict) and \
               'coordinates' in channels_view_result:
                search_render = channels_view_result['coordinates'][channels_view.coordinates][0]
                result['css_links'] = [c for c in channels_view_result['css_links']
                                       if c not in resources['css_links']]
                result['js_links'] = [c for c in channels_view_result['js_links']
                                      if c not in resources['js_links']]
                channels = channels_view.render_item(
                    search_render,
                    channels_view.coordinates,
                    None)

            result['channels'] = channels
            update_resources(self.request, result)

        return result
Пример #7
0
def messages_choice(node, kw):
    request = node.bindings['request']
    root = request.root
    yammer_connectors = list(root.get_connectors(YAMMER_CONNECTOR_ID))
    yammer_connector = yammer_connectors[0] if yammer_connectors else None
    access_token = yammer_connector.get_access_tokens(get_current()).get('access_token', None) \
        if yammer_connector else None
    values = []
    page = ''
    limit = 10
    ajax_url = None
    if yammer_connector and access_token:
        try:
            yammer = yampy.Yammer(access_token=access_token)
            messages = yammer.client.get('/messages',
                                         threaded=True,
                                         limit=limit)
            page = messages['messages'][-1]['id']
            values = [(str(e['id']),
                       html_to_text(e['body']['plain'][:150]) + '...')
                      for e in messages['messages']]
            if messages['meta']['older_available']:
                ajax_url = request.resource_url(
                    root, '@@yammerapi', query={'op': 'find_yammer_messages'})
        except Exception as error:
            log.warning(error)

    return AjaxCheckBoxWidget(
        values=values,
        url=ajax_url,
        limit=limit,
        page=page,
        multiple=True,
    )
Пример #8
0
    def find_yammer_messages(self):
        root = self.request.root
        yammer_connectors = list(root.get_connectors(YAMMER_CONNECTOR_ID))
        yammer_connector = yammer_connectors[0] if yammer_connectors else None
        access_token = yammer_connector.get_access_tokens(get_current()).get('access_token', None) \
            if yammer_connector else None
        if yammer_connector and access_token:
            page = self.params('page')
            limit = self.params('limit')
            try:
                yammer = yampy.Yammer(access_token=access_token)
                messages = yammer.client.get(
                    '/messages', older_than=page, threaded=True, limit=limit)
                if messages['messages']:
                    current_ideas = [i.source_data[YAMMER_CONNECTOR_ID]['id']
                                     for i in find_yammer_content([Iidea])]
                    entries = [{'id': e['id'],
                                'text': html_to_text(e['body']['plain'][:150])+'...',
                                'imported': str(e['id']) in current_ideas}
                               for e in messages['messages']]
                    return {
                        'items': entries,
                        'total_count': len(messages['messages']),
                        'has_next': messages['meta']['older_available'],
                        'next_page': messages['messages'][-1]['id']}
            except Exception as error:
                log.warning(error)

        return {'items': [], 'total_count': 0}
Пример #9
0
def sort_on(name, objects, reverse=False, **kwargs):
    sort = SORTS.get(name, None)
    if not sort:
        log.warning('Sort not valid')
        sort = SORTS.get(DEFAULT_SORT)

    return sort['sort'](objects, reverse, **kwargs)
Пример #10
0
    def get_content_template(self):
        if self.content_template:
            try:
                return self.content_template.fp.readall().decode()
            except Exception as error:
                log.warning(error)

        return ''
Пример #11
0
    def get_content_template(self):
        if self.content_template:
            try:
                return self.content_template.fp.readall().decode()
            except Exception as error:
                log.warning(error)

        return ''
Пример #12
0
def upload_file(url):
    try:
        buf = io.BytesIO(urllib.request.urlopen(url).read())
        buf.seek(0)
        filename = url.split('/')[-1]
        return File(fp=buf, filename=filename)
    except Exception as e:
        log.warning(e)
        return None
Пример #13
0
 def calculate_posted_filter(self):
     try:
         form_data = self._build_form()
         values = self.request.POST or self.request.GET
         controls = values.items()
         validated = form_data[0].validate(controls)
         setattr(self, 'validated', validated)
     except Exception as e:
         log.warning(e)
Пример #14
0
 def calculate_posted_filter(self):
     try:
         form_data = self._build_form()
         values = self.request.POST or self.request.GET
         controls = values.items()
         validated = form_data[0].validate(controls)
         setattr(self, 'validated', validated)
     except Exception as e:
         log.warning(e)
Пример #15
0
 def title_getter(oid):
     try:
         obj = get_obj(int(oid), None)
         if obj:
             return obj.title
         else:
             return oid
     except Exception as e:
         log.warning(e)
         return oid
Пример #16
0
 def title_getter(id):
     try:
         obj = get_obj(int(id), None)
         if obj:
             return obj.title
         else:
             return id
     except Exception as e:
         log.warning(e)
         return id
Пример #17
0
    def bind(self):
        bindings = {}
        ballot_id = self.params('id')
        context = None
        try:
            context = get_obj(int(ballot_id))
        except Exception as error:
            log.warning(error)

        bindings['context'] = context
        setattr(self, '_bindings', bindings)
Пример #18
0
def upload_file(url):
    try:
        buf = io.BytesIO(urllib.request.urlopen(url).read())
        buf.seek(0)
        filename = url.split('/')[-1]
        return File(
            fp=buf,
            filename=filename)
    except Exception as e:
        log.warning(e)
        return None
Пример #19
0
def alert(kind="", senders=[], recipients=[], exclude=[], **kwargs):
    alert_op = ALERTS.get(kind, None)
    if alert_op:
        try:
            recipients = list(set(recipients)) if isinstance(recipients, (list, set)) else recipients
            return alert_op(senders, recipients, exclude, **kwargs)
        except Exception as error:
            log.warning(error)
            return None

    log.warning("Alert kind {kind} not implemented".format(kind=kind))
    return None
    def update(self):
        oid = self.params('oid')
        if oid:
            try:
                newsletter = get_obj(int(oid))
                user = self.params('user')
                result = self.execute({'newsletter': newsletter, 'user': user})
                return result[0]
            except Exception as error:
                log.warning(error)

        root = getSite()
        return HTTPFound(self.request.resource_url(root, ""))
Пример #21
0
def alert_end_cycle_duration(process):
    alert = getattr(process, 'previous_alert', -1) + 1
    alert_op = ALERTS.get(alert, None)
    proposal = process.execution_context.created_entity('proposal')
    if alert_op and proposal:
        working_group = proposal.working_group
        date = getattr(working_group, 'work_duration', None)
        if not date:
            date = calculate_improvement_cycle_duration(process)

        alert_date = alert_op(process, date)
        log.warning(alert_date)
        return alert_date

    return datetime.datetime.now()
Пример #22
0
def blur_img(fp, filename):
    try:
        img = Image.open(fp)
        if img.mode == 'P':
            img = img.convert('RGB')
    except OSError as e:
        log.warning(e)
        return {}

    img = img.filter(ImageFilter.GaussianBlur(radius=25))
    buf = io.BytesIO()
    ext = os.path.splitext(filename)[1].lower()
    img.save(buf, Image.EXTENSION.get(ext, 'jpeg'))
    buf.seek(0)
    return {'fp': buf, 'id': 'blur'}
Пример #23
0
def alert_end_cycle_duration(process):
    alert = getattr(process, 'previous_alert', -1) + 1
    alert_op = ALERTS.get(alert, None)
    proposal = process.execution_context.created_entity('proposal')
    if alert_op and proposal:
        working_group = proposal.working_group
        date = getattr(
            working_group, 'work_duration', None)
        if not date:
            date = calculate_improvement_cycle_duration(process)

        alert_date = alert_op(process, date)
        log.warning(alert_date)
        return alert_date

    return datetime.datetime.now()
Пример #24
0
    def calculate_posted_filter(self):
        form, reqts = self._build_form()
        form.formid = self.viewid + '_' + form.formid
        posted_formid = None
        values = self.request.POST or self.request.GET
        if '__formid__' in values:
            posted_formid = values['__formid__']

        if posted_formid is not None and posted_formid == form.formid:
            try:
                controls = values.items()
                validated = form.validate(controls)
                self.validated = validated
                self.validated['request'] = self.request
                self._validated = validated.copy()
            except Exception as e:
                log.warning(e)
Пример #25
0
def validate_file_content(node, appstruct, width, height):
    if appstruct['picture']:
        mimetype = appstruct['picture']['mimetype']
        file_value = getattr(appstruct['picture']['fp'], 'raw',
                             appstruct['picture']['fp'])
        if mimetype.startswith('image'):
            try:
                file_value.seek(0)
            except Exception as e:
                log.warning(e)

            img = Image.open(file_value)
            img_width = img.size[0]
            img_height = img.size[1]
            file_value.seek(0)
            if img_width > width or img_height > height:
                raise colander.Invalid(
                    node,
                    _(
                        _('The image size is not valid: the allowed size is ${width} x ${height} px.',
                          mapping={
                              'width': width,
                              'height': height
                          })))

        if mimetype.startswith('application/x-shockwave-flash'):
            try:
                file_value.seek(0)
            except Exception as e:
                log.warning(e)

            header = parse(file_value)
            file_value.seek(0)
            flash_width = header['width']
            flash_height = header['height']
            if flash_width > width or flash_height > height:
                raise colander.Invalid(
                    node,
                    _(
                        _('The Flash animation size is not valid: the allowed size is ${width} x ${height} px.',
                          mapping={
                              'width': width,
                              'height': height
                          })))
Пример #26
0
    def creat_idea(self):
        behavior = None
        try:
            tree = self.params('tree')
            tree = json.loads(tree) if tree else DEFAULT_TREE
            behavior = self.behaviors_instances['Create_an_idea']
            values = {
                'title': self.params('title'),
                'text': self.params('text'),
                'tree': tree
            }
            challenge = self.params('challenge')
            if challenge:
                try:
                    challenge = get_obj(int(challenge))
                    values['challenge'] = challenge
                except:
                    pass

            idea = Idea()
            idea.set_data(values)
            appstruct = {'_object_data': idea}
            behavior.execute(self.context, self.request, appstruct)
            oid = get_oid(idea)
            new_title = ''  #self._get_new_title(user)
            data = {
                'title':
                idea.title,
                'oid':
                str(oid),
                'body':
                renderers.render(self.idea_template, {'idea': idea},
                                 self.request),
                'new_title':
                new_title
            }
            result = data
            return result
        except Exception as error:
            log.warning(error)
            return {}
Пример #27
0
    def find_yammer_messages(self):
        root = self.request.root
        yammer_connectors = list(root.get_connectors(YAMMER_CONNECTOR_ID))
        yammer_connector = yammer_connectors[0] if yammer_connectors else None
        access_token = yammer_connector.get_access_tokens(get_current()).get('access_token', None) \
            if yammer_connector else None
        if yammer_connector and access_token:
            page = self.params('page')
            limit = self.params('limit')
            try:
                yammer = yampy.Yammer(access_token=access_token)
                messages = yammer.client.get('/messages',
                                             older_than=page,
                                             threaded=True,
                                             limit=limit)
                if messages['messages']:
                    current_ideas = [
                        i.source_data[YAMMER_CONNECTOR_ID]['id']
                        for i in find_yammer_content([Iidea])
                    ]
                    entries = [{
                        'id':
                        e['id'],
                        'text':
                        html_to_text(e['body']['plain'][:150]) + '...',
                        'imported':
                        str(e['id']) in current_ideas
                    } for e in messages['messages']]
                    return {
                        'items': entries,
                        'total_count': len(messages['messages']),
                        'has_next': messages['meta']['older_available'],
                        'next_page': messages['messages'][-1]['id']
                    }
            except Exception as error:
                log.warning(error)

        return {'items': [], 'total_count': 0}
Пример #28
0
    def creat_idea(self):
        behavior = None
        try:
            behavior = self.behaviors_instances['Create_an_idea']
            values = {'title': self.params('title'),
                      'text': self.params('text')}
            keywords = self.params('keywords')
            if not isinstance(keywords, (list, tuple)):
                keywords = [keywords]

            values['keywords'] = keywords
            challenge = self.params('challenge')
            if challenge:
                try:
                    challenge = get_obj(int(challenge))
                    values['challenge'] = challenge
                except:
                    pass

            idea = Idea()
            idea.set_data(values)
            appstruct = {'_object_data': idea}
            behavior.execute(self.context, self.request, appstruct)
            oid = get_oid(idea)
            new_title = ''#self._get_new_title(user)
            data = {'title': idea.title,
                    'oid': str(oid),
                    'body': renderers.render(self.idea_template,
                                             {'idea': idea},
                                             self.request),
                    'new_title': new_title
                    }
            result = data
            return result
        except Exception as error:
            log.warning(error)
            return {}
Пример #29
0
    def __call__(self, has_admin_nav=False):
        result = {'condition': False}
        if self.request.user:
            channels_view = SeeChannels(self.context, self.request)
            try:
                channels_view_result = channels_view()
            except Exception as error:
                log.warning(error)
                return {'condition': False}

            channels = ''
            result = {
                'condition': True,
                'css_links': [],
                'js_links': [],
                'has_admin_nav': has_admin_nav
            }
            if isinstance(channels_view_result, dict) and \
               'coordinates' in channels_view_result:
                search_render = channels_view_result['coordinates'][
                    channels_view.coordinates][0]
                result['css_links'] = [
                    c for c in channels_view_result['css_links']
                    if c not in resources['css_links']
                ]
                result['js_links'] = [
                    c for c in channels_view_result['js_links']
                    if c not in resources['js_links']
                ]
                channels = channels_view.render_item(search_render,
                                                     channels_view.coordinates,
                                                     None)

            result['channels'] = channels
            update_resources(self.request, result)

        return result
Пример #30
0
def generate_images(fp, filename, dimension):
    x = dimension.get('x', 0)
    y = dimension.get('y', 0)
    deg = dimension.get('r', 0)
    area_height = dimension.get('area_height', 0)
    area_width = dimension.get('area_width', 0)
    result = []
    for img_format in IMAGES_FORMATS:
        try:
            img = Image.open(fp)
            if img.mode == 'P':
                img = img.convert('RGB')
        except OSError as e:
            log.warning(e)
            return result

        height = img.size[1]
        width = img.size[0]
        size = img_format['size']
        left, upper, right, lower = _get_coordinates(height, width,
                                                     area_height, area_width,
                                                     x, y, size[1], size[0])
        img = img.rotate(deg).crop((left, upper, right, lower))
        img.thumbnail(size, Image.ANTIALIAS)
        buf = io.BytesIO()
        ext = os.path.splitext(filename)[1].lower()
        img.save(buf, Image.EXTENSION.get(ext, 'jpeg'))
        buf.seek(0)
        try:
            img_data = img_format.copy()
            img_data['fp'] = buf
            result.append(img_data)
        except Exception as e:
            log.warning(e)

    result.append(blur_img(fp, filename))
    return result
Пример #31
0
    def __call__(self):
        is_homepage = self.request.view_name in ('index', '')
        if not is_homepage or 'challenge' not in self.request.content_to_manage:
            return {'condition': False}

        challenges_view = SeeChallengesHomeView(self.context, self.request)
        try:
            challenges_view_result = challenges_view()
            if getattr(challenges_view, 'no_challenges', False):
                return {'condition': False}

        except Exception as error:
            log.warning(error)
            return {'condition': False}

        challenges = ''
        result = {'condition': True, 'css_links': [], 'js_links': []}
        if isinstance(challenges_view_result, dict) and \
           'coordinates' in challenges_view_result:
            search_render = challenges_view_result['coordinates'][
                challenges_view.coordinates][0]
            result['css_links'] = [
                c for c in challenges_view_result['css_links']
                if c not in resources['css_links']
            ]
            result['js_links'] = [
                c for c in challenges_view_result['js_links']
                if c not in resources['js_links']
            ]
            challenges = challenges_view.render_item(
                search_render, challenges_view.coordinates, None)

        result['challenges'] = challenges
        result['view'] = self
        update_resources(self.request, result)
        return result
Пример #32
0
    def creat_home_question(self):
        try:
            view_name = self.params('source_path')
            view_name = view_name if view_name else ''
            is_mycontents_view = view_name.endswith('seemycontents')
            context = self.context
            try:
                source_path = '/'.join(view_name.split('/')[:-1])
                context = find_resource(self.context, source_path)
            except Exception as error:
                log.warning(error)

            is_challenge = isinstance(context, Challenge)
            redirect = False
            for action_id in self.behaviors_instances:
                if action_id in self.request.POST:
                    button = action_id
                    break

            add_question_action = self.behaviors_instances[button]
            add_question_view = DEFAULTMAPPING_ACTIONS_VIEWS[
                add_question_action.__class__]
            add_question_view_instance = add_question_view(
                self.context, self.request, behaviors=[add_question_action])
            add_question_view_instance.setviewid('formaskquestionhome')
            add_question_view_result = add_question_view_instance()
            if add_question_view_instance.finished_successfully:
                result = get_components_data(
                    **get_all_updated_data(add_question_action,
                                           self.request,
                                           self.context,
                                           self,
                                           view_data=(
                                               add_question_view_instance,
                                               add_question_view_result)))
                user = get_current()
                body = ''
                if not redirect:
                    question = sorted(user.get_questions(user),
                                      key=lambda w: w.created_at)[-1]
                    if not is_mycontents_view and \
                       'published' not in question.state:
                        redirect = True
                    else:
                        if is_mycontents_view:
                            result['item_target'] = 'results_contents'
                        elif is_challenge:
                            result[
                                'item_target'] = 'results-challenge-questions'
                        else:
                            result['item_target'] = 'results-home-questions'

                        body += render_listing_obj(self.request, question,
                                                   user)

                if not redirect:
                    result['redirect_url'] = None

                result['new_obj_body'] = body
                result['status'] = True
                return result

        except Exception as error:
            log.warning(error)
            return {'status': False}

        return {'status': False}
Пример #33
0
    def creat_home_idea(self):
        try:
            view_name = self.params('source_path')
            view_name = view_name if view_name else ''
            is_mycontents_view = view_name.endswith('seemycontents')
            context = self.context
            try:
                source_path = '/'.join(view_name.split('/')[:-1])
                context = find_resource(self.context, source_path)
            except Exception as error:
                log.warning(error)

            is_challenge = isinstance(context, Challenge)
            redirect = False
            for action_id in self.behaviors_instances:
                if action_id in self.request.POST:
                    button = action_id
                    break

            add_idea_action = self.behaviors_instances[button]
            add_idea_view = DEFAULTMAPPING_ACTIONS_VIEWS[add_idea_action.__class__]
            add_idea_view_instance = add_idea_view(
                self.context, self.request, behaviors=[add_idea_action])
            add_idea_view_instance.setviewid('formcreateideahome')
            add_idea_view_result = add_idea_view_instance()
            if add_idea_view_instance.finished_successfully:
                result = get_components_data(
                    **get_all_updated_data(
                        add_idea_action, self.request, self.context, self,
                        view_data=(add_idea_view_instance, add_idea_view_result)
                    ))
                user = get_current()
                body = ''
                if button == 'Create_a_working_group':
                    redirect = True
                    proposal = sorted(
                        user.get_working_groups(user),
                        key=lambda w: w.created_at)[-1].proposal
                    if is_mycontents_view:
                        redirect = False
                        body = render_listing_obj(
                            self.request, proposal, user)

                if not redirect:
                    idea = sorted(
                        user.get_ideas(user),
                        key=lambda w: w.created_at)[-1]
                    if not is_mycontents_view and \
                       'published' not in idea.state:
                        redirect = True
                    else:
                        if is_mycontents_view:
                            result['item_target'] = 'results_contents'
                        elif is_challenge:
                            result['item_target'] = 'results-challenge-ideas'
                        else:
                            result['item_target'] = 'results-home-ideas'

                        body = body + render_listing_obj(
                            self.request, idea, user)

                if not redirect:
                    result['redirect_url'] = None

                result['new_obj_body'] = body
                result['status'] = True
                return result

        except Exception as error:
            log.warning(error)
            return {'status': False}

        return {'status': False}
Пример #34
0
    def update(self):
        current_user = get_current()
        self.is_moderator = has_role(
            user=current_user, role=('Moderator',))
        result = {}
        channel = self._get_channel(current_user)
        is_selected = hasattr(self, 'comments')
        text_to_search = self.params('text')
        filtered = False
        if not is_selected:
            filters = self.params('filters')
            filters = filters if filters else []
            if not isinstance(filters, (list, tuple)):
                filters = [filters]

            filtered = text_to_search or\
                any(f in filters for f in ['associations', 'file', 'pinned'])

            objects = get_comments(
                channel, filters, text_to_search, filtered)
        else:
            objects = sorted(
                getattr(self, 'comments', []),
                key=lambda e: e.created_at, reverse=True)

        unread_comments = []
        if channel:
            now = datetime.datetime.now(tz=pytz.UTC)
            unread_comments = channel.get_comments_between(
                current_user.get_read_date(channel),
                now)
            current_user.set_read_date(
                channel, now)

        url = self.request.resource_url(self.context, self.action_id)
        batch = Batch(objects,
                      self.request,
                      url=url,
                      default_size=BATCH_DEFAULT_SIZE)
        batch.target = "#" + self.action_id + "_results"
        batch.origin_url = url
        body, resources = self._rendre_comments(
            batch, current_user, True, batch,
            unread_comments, filtered)
        item = self.adapt_item(body, self.viewid)
        try:
            filter_actions = [
                {'title': _('Associations'),
                 'class_css': 'comment-filter-action',
                 'name': 'associations',
                 'style_picto': 'glyphicon glyphicon-link'},
                {'title': _('Attached files'),
                 'class_css': 'comment-filter-action',
                 'name': 'file',
                 'style_picto': 'glyphicon glyphicon-paperclip'},
                {'title': _('Pinned'),
                 'class_css': 'comment-filter-action',
                 'name': 'pinned',
                 'style_picto': 'typcn typcn-pin'},
            ]
            navbars = generate_navbars(
                self.request, channel,
                template=self.channel_navbar_template,
                global_action=filter_actions)
            item['channel_navbar_body'] = navbars['navbar_body']
        except Exception as error:
            log.warning(error)

        result['coordinates'] = {self.coordinates: [item]}
        result.update(resources)
        result = merge_dicts(self.requirements_copy, result)
        return result
Пример #35
0
    def update(self):
        current_user = get_current()
        self.is_moderator = has_role(user=current_user, role=('Moderator', ))
        result = {}
        channel = self._get_channel(current_user)
        is_selected = hasattr(self, 'comments')
        text_to_search = self.params('text')
        filtered = False
        if not is_selected:
            filters = self.params('filters')
            filters = filters if filters else []
            if not isinstance(filters, (list, tuple)):
                filters = [filters]

            filtered = text_to_search or\
                any(f in filters for f in ['associations', 'file', 'pinned'])

            objects = get_comments(channel, filters, text_to_search, filtered)
        else:
            objects = sorted(getattr(self, 'comments', []),
                             key=lambda e: e.created_at,
                             reverse=True)

        unread_comments = []
        if channel:
            now = datetime.datetime.now(tz=pytz.UTC)
            unread_comments = channel.get_comments_between(
                current_user.get_read_date(channel), now)
            current_user.set_read_date(channel, now)

        url = self.request.resource_url(self.context, self.action_id)
        batch = Batch(objects,
                      self.request,
                      url=url,
                      default_size=BATCH_DEFAULT_SIZE)
        batch.target = "#" + self.action_id + "_results"
        batch.origin_url = url
        body, resources = self._rendre_comments(batch, current_user, True,
                                                batch, unread_comments,
                                                filtered)
        item = self.adapt_item(body, self.viewid)
        try:
            filter_actions = [
                {
                    'title': _('Associations'),
                    'class_css': 'comment-filter-action',
                    'name': 'associations',
                    'style_picto': 'glyphicon glyphicon-link'
                },
                {
                    'title': _('Attached files'),
                    'class_css': 'comment-filter-action',
                    'name': 'file',
                    'style_picto': 'glyphicon glyphicon-paperclip'
                },
                {
                    'title': _('Pinned'),
                    'class_css': 'comment-filter-action',
                    'name': 'pinned',
                    'style_picto': 'typcn typcn-pin'
                },
            ]
            navbars = generate_navbars(self.request,
                                       channel,
                                       template=self.channel_navbar_template,
                                       global_action=filter_actions)
            item['channel_navbar_body'] = navbars['navbar_body']
        except Exception as error:
            log.warning(error)

        result['coordinates'] = {self.coordinates: [item]}
        result.update(resources)
        result = merge_dicts(self.requirements_copy, result)
        return result
Пример #36
0
def find_entities(user=None,
                  add_query=None,
                  intersect=None,
                  force_publication_date=False,
                  sort_on=None,
                  reverse=False,
                  filters=[],
                  filter_op='and',
                  **args):
    if intersect is not None and len(intersect) == 0:
        return ResultSet([], 0, None)

    schema = FilterSchema()
    dace_catalog = find_catalog('dace')
    novaideo_catalog = find_catalog('novaideo')
    system_catalog = find_catalog('system')
    filters = deepcopy(filters)
    root = getSite()
    for filter_ in filters:
        filter_['dace'] = dace_catalog
        filter_['novaideo'] = novaideo_catalog
        filter_['system'] = system_catalog
        filter_['root'] = root

    query = get_filters_query(schema, filters, filter_op)
    and_op = QUERY_OPERATORS.get('and', 'default')
    if add_query:
        query = and_op(query, add_query)

    if args:
        args['dace'] = dace_catalog
        args['novaideo'] = novaideo_catalog
        args['system'] = system_catalog
        args['root'] = root
        args_query = get_filters_query(schema, [args], filter_op)
        query = and_op(query, args_query)

    if user:
        root = getSite()
        access_keys = novaideo_catalog['access_keys']
        keys = getattr(user, '__access_keys__', _marker)
        if keys is _marker:
            keys = core.generate_access_keys(user, root)

        keys = list(keys)
        if not(isinstance(user, Anonymous) and \
               getattr(root, 'only_for_members', False)):
            keys.append('always')

        query = and_op(query, access_keys.any(keys))

    #add publication interval
    # if force_publication_date or \
    #    not has_any_roles(roles=('PortalManager',)):
    #     start_date = end_date = datetime.datetime.now()
    #     start_date = datetime.datetime.combine(
    #         start_date,
    #         datetime.time(0, 0, 0, tzinfo=pytz.UTC))
    #     end_date = datetime.datetime.combine(
    #         end_date,
    #         datetime.time(23, 59, 59, tzinfo=pytz.UTC))
    #     start_date_index = novaideo_catalog['publication_start_date']
    #     query = and_op(query, start_date_index.inrange_with_not_indexed(
    #         start_date, end_date))

    #    print(query.print_tree())
    #    from timeit import default_timer as timer
    #    start = timer()
    try:
        result_set = query.execute()
    except ParseError as error:
        log.warning(error)
        return []
    #    end = timer() - start
    #    print(end)
    if intersect is not None:
        result_set = result_set.intersect(intersect)

    if sort_on is not None:
        result_set = filter_sort(
            sort_on, result_set, reverse=reverse,
            novaideo_catalog=novaideo_catalog)

    return result_set
Пример #37
0
    def update(self):
        request = self.request
        context = self.context
        login_url = request.resource_url(request.context, 'login')
        login_url2 = request.resource_url(request.context, '@@login')
        referrer = self.params('came_from')
        if not referrer:
            referrer = request.path_url

        if '/auditstream-sse' in referrer:
            # If we're being invoked as the result of a failed request to the
            # auditstream sse view, bail.  Otherwise the came_from will be set to
            # the auditstream URL, and the user who this happens to will eventually
            # be redirected to it and they'll be left scratching their head when
            # they see e.g. "id: 0-10\ndata: " when they log in successfully.
            return HTTPForbidden()

        if login_url in referrer or login_url2 in referrer:
            # never use the login form itself as came_from
            referrer = request.resource_url(request.virtual_root)

        came_from = request.session.setdefault('novaideo.came_from', referrer)
        login = ''
        password = ''
        message = None
        messages = {}
        if 'form.submitted' in request.params:

            try:
                check_csrf_token(request)
            except:
                request.sdiapi.flash(_('Failed login (CSRF)'), 'danger')
            else:
                self.execute(None)
                login = request.params['email'].strip()
                password = request.params['password']
                novaideo_catalog = find_catalog('novaideo')
                dace_catalog = find_catalog('dace')
                identifier_index = novaideo_catalog['identifier']
                object_provides_index = dace_catalog['object_provides']
                query = object_provides_index.any([IPerson.__identifier__]) &\
                    identifier_index.any([login])
                users = list(query.execute().all())
                user = users[0] if users else None
                valid_check = user and user.check_password(password)
                if valid_check and \
                   (has_role(user=user, role=('SiteAdmin', )) or
                        'active' in getattr(user, 'state', [])):
                    request.session.pop('novaideo.came_from', None)
                    headers = remember(request, get_oid(user))
                    request.registry.notify(
                        LoggedIn(login, user, context, request))
                    user.last_connection = datetime.datetime.now(tz=pytz.UTC)
                    if hasattr(user, 'reindex'):
                        user.reindex()

                    return HTTPFound(location=came_from, headers=headers)
                elif valid_check and 'deactivated' in getattr(
                        user, 'state', []):
                    error = ViewError()
                    error.principalmessage = _(
                        "Disabled account! Contact the site administrator to activate your account."
                    )
                    message = error.render_message(request)
                    messages.update({error.type: [message]})
                else:
                    error = ViewError()
                    error.principalmessage = _("Failed login")
                    message = error.render_message(request)
                    messages.update({error.type: [message]})

        # Pass this through FBO views (e.g., forbidden) which use its macros.
        template = get_renderer(
            'novaideo:views/user_management/templates/login.pt'
        ).implementation()
        login_bodies = []
        try:
            login_navbars = generate_navbars(request,
                                             request.root,
                                             process_id=CONNECTOR_PROCESSES,
                                             node_id='login',
                                             descriminators=['body-action'])
            login_bodies = login_navbars['body_actions']
        except Exception as e:
            log.warning(e)

        values = dict(url=request.resource_url(request.virtual_root, 'login'),
                      came_from=came_from,
                      login=login,
                      password=password,
                      login_template=template,
                      logins=login_bodies)
        body = self.content(args=values, template=self.template)['body']
        item = self.adapt_item(body, self.viewid)
        item['messages'] = messages
        result = {}
        result['coordinates'] = {self.coordinates: [item]}
        return result
Пример #38
0
def time_date(process):
    alert_date = getattr(process, 'alert_date', datetime.datetime.now())
    alert_date = alert_date - datetime.timedelta(days=1)
    log.warning(alert_date)
    return alert_date
Пример #39
0
    def update(self):
        request = self.request
        context = self.context
        login_url = request.resource_url(request.context, 'login')
        login_url2 = request.resource_url(request.context, '@@login')
        referrer = self.params('came_from')
        if not referrer:
            referrer = request.path_url

        if '/auditstream-sse' in referrer:
            # If we're being invoked as the result of a failed request to the
            # auditstream sse view, bail.  Otherwise the came_from will be set to
            # the auditstream URL, and the user who this happens to will eventually
            # be redirected to it and they'll be left scratching their head when
            # they see e.g. "id: 0-10\ndata: " when they log in successfully.
            return HTTPForbidden()

        if login_url in referrer or login_url2 in referrer:
            # never use the login form itself as came_from
            referrer = request.resource_url(request.virtual_root)

        came_from = request.session.setdefault('novaideo.came_from', referrer)
        login = ''
        password = ''
        message = None
        messages = {}
        if 'form.submitted' in request.params:

            try:
                check_csrf_token(request)
            except:
                request.sdiapi.flash(_('Failed login (CSRF)'), 'danger')
            else:
                self.execute(None)
                login = request.params['email'].strip()
                password = request.params['password']
                novaideo_catalog = find_catalog('novaideo')
                dace_catalog = find_catalog('dace')
                identifier_index = novaideo_catalog['identifier']
                object_provides_index = dace_catalog['object_provides']
                query = object_provides_index.any([IPerson.__identifier__]) &\
                        identifier_index.any([login])
                users = list(query.execute().all())
                user = users[0] if users else None
                valid_check = user and user.check_password(password)
                if valid_check and \
                   (has_role(user=user, role=('SiteAdmin', )) or \
                   'active' in getattr(user, 'state', [])):
                    request.session.pop('novaideo.came_from', None)
                    headers = remember(request, get_oid(user))
                    request.registry.notify(LoggedIn(login, user,
                                               context, request))
                    user.last_connection = datetime.datetime.now(tz=pytz.UTC)
                    if hasattr(user, 'reindex'):
                        user.reindex()

                    return HTTPFound(location=came_from, headers=headers)
                elif valid_check and 'deactivated' in getattr(user, 'state', []):
                    error = ViewError()
                    error.principalmessage = _("Disabled account! Contact the site administrator to activate your account.")
                    message = error.render_message(request)
                    messages.update({error.type: [message]})
                else:
                    error = ViewError()
                    error.principalmessage = _("Failed login")
                    message = error.render_message(request)
                    messages.update({error.type: [message]})

        # Pass this through FBO views (e.g., forbidden) which use its macros.
        template = get_renderer('novaideo:views/user_management/templates/login.pt').implementation()
        login_bodies = []
        try:
            login_navbars = generate_navbars(
                request, request.root,
                process_id=CONNECTOR_PROCESSES,
                node_id='login',
                descriminators=['body-action'])
            login_bodies = login_navbars['body_actions']
        except Exception as e:
            log.warning(e)

        values = dict(
            url=request.resource_url(request.virtual_root, 'login'),
            came_from=came_from,
            login=login,
            password=password,
            login_template=template,
            logins=login_bodies
            )
        body = self.content(args=values, template=self.template)['body']
        item = self.adapt_item(body, self.viewid)
        item['messages'] = messages
        result = {}
        result['coordinates'] = {self.coordinates: [item]}
        return result
Пример #40
0
    def start(self, context, request, appstruct, **kw):
        result = super(CrateAndPublishAsProposal, self).start(
            context, request, appstruct, **kw)
        root = getSite()
        state = result.get('state', False)
        if state:
            idea = result.get('newcontext', None)
            if idea:
                user = get_current(request)
                mask = user.get_mask(root) if hasattr(user, 'get_mask') else user
                author = mask if appstruct.get('anonymous', False) and mask else user
                idea.subscribe_to_channel(user)
                related_ideas = [idea]
                localizer = request.localizer
                title = idea.title + \
                    localizer.translate(_(" (the proposal)"))
                template = getattr(root, 'proposal_template', None)
                text = '<p>{idea_text}</p>'
                if template:
                    try:
                        text = template.fp.readall().decode()
                    except Exception as error:
                        log.warning(error)

                proposal = Proposal(
                    title=title,
                    description=idea.text[:600],
                    text=text.format(
                        idea_text=idea.text.replace('\n', '<br/>')),
                    keywords=list(idea.keywords)
                    )
                proposal.text = html_diff_wrapper.normalize_text(proposal.text)
                root.addtoproperty('proposals', proposal)
                proposal.state.append('draft')
                grant_roles(user=author, roles=(('Owner', proposal), ))
                grant_roles(user=author, roles=(('Participant', proposal), ))
                proposal.setproperty('author', author)
                challenge = idea.challenge
                if challenge:
                    proposal.setproperty('challenge', challenge)

                wg = WorkingGroup()
                root.addtoproperty('working_groups', wg)
                wg.init_workspace()
                wg.setproperty('proposal', proposal)
                wg.addtoproperty('members', author)
                wg.state.append('deactivated')
                if related_ideas:
                    connect(proposal,
                            related_ideas,
                            {'comment': _('Add related ideas'),
                             'type': _('Creation')},
                            author,
                            ['related_proposals', 'related_ideas'],
                            CorrelationType.solid)
                try:
                    files = {
                        'add_files': {
                            'attached_files': [{'_object_data': f.copy()} for
                                               f in idea.attached_files]
                        }
                    }
                    add_attached_files(files, proposal)
                except Exception:
                    pass

                proposal.subscribe_to_channel(user)
                proposal.reindex()
                init_proposal_ballots(proposal)
                wg.reindex()
                request.registry.notify(
                    ActivityExecuted(self, [idea, proposal, wg], author))
                return {'newcontext': proposal}

        return {'newcontext': root}