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
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)
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
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
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
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
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, )
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}
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)
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 ''
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
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)
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
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
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)
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
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, ""))
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()
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'}
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()
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)
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 })))
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 {}
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}
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 {}
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
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
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
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}
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}
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
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
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
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
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
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
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}