# -*- coding: utf-8 -*- # Copyright 2010 - 2017 RhodeCode GmbH and the AppEnlight project authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import logging import sqlalchemy as sa from datetime import datetime from appenlight.models import Base, get_db_session from appenlight.models.services.event import EventService from appenlight.models.integrations import IntegrationException from pyramid.threadlocal import get_current_request from ziggurat_foundations.models.user import UserMixin from ziggurat_foundations.models.services.user import UserService log = logging.getLogger(__name__) class User(UserMixin, Base): __possible_permissions__ = [] first_name = sa.Column(sa.Unicode(25)) last_name = sa.Column(sa.Unicode(25)) company_name = sa.Column(sa.Unicode(255), default='') company_address = sa.Column(sa.Unicode(255), default='') zip_code = sa.Column(sa.Unicode(25), default='') city = sa.Column(sa.Unicode(50), default='') default_report_sort = sa.Column(sa.Unicode(25), default='newest') notes = sa.Column(sa.UnicodeText, default='') notifications = sa.Column(sa.Boolean(), default=True) registration_ip = sa.Column(sa.UnicodeText(), default='') alert_channels = sa.orm.relationship('AlertChannel', cascade="all,delete-orphan", passive_deletes=True, passive_updates=True, backref='owner', order_by='AlertChannel.channel_name, ' 'AlertChannel.channel_value') alert_actions = sa.orm.relationship('AlertChannelAction', cascade="all,delete-orphan", passive_deletes=True, passive_updates=True, backref='owner', order_by='AlertChannelAction.pkey') auth_tokens = sa.orm.relationship('AuthToken', cascade="all,delete-orphan", passive_deletes=True, passive_updates=True, backref='owner', order_by='AuthToken.creation_date') def get_dict(self, exclude_keys=None, include_keys=None, extended_info=False): result = super(User, self).get_dict(exclude_keys, include_keys) if extended_info: result['groups'] = [g.group_name for g in self.groups] result['permissions'] = [p.perm_name for p in UserService.permissions(self)] request = get_current_request() apps = UserService.resources_with_perms(self, ['view'], resource_types=['application']) result['applications'] = sorted( [{'resource_id': a.resource_id, 'resource_name': a.resource_name} for a in apps.all()], key=lambda x: x['resource_name'].lower()) result['assigned_reports'] = [r.get_dict(request) for r in self.assigned_report_groups] result['latest_events'] = [ev.get_dict(request) for ev in self.latest_events()] exclude_keys_list = exclude_keys or [] include_keys_list = include_keys or [] d = {} for k in result.keys(): if (k not in exclude_keys_list and (k in include_keys_list or not include_keys)): d[k] = result[k] return d def __repr__(self): return '' % (self.user_name, self.id) @property def assigned_report_groups(self): from appenlight.models.report_group import ReportGroup resources = UserService.resources_with_perms(self, ['view'], resource_types=['application']) query = self.assigned_reports_relation rid_list = [r.resource_id for r in resources] query = query.filter(ReportGroup.resource_id.in_(rid_list)) query = query.limit(50) return query def feed_report(self, report): """ """ if not hasattr(self, 'current_reports'): self.current_reports = [] self.current_reports.append(report) def send_digest(self, request, application, reports, since_when=None, db_session=None): db_session = get_db_session(db_session) if not reports: return True if not since_when: since_when = datetime.utcnow() for channel in self.alert_channels: if not channel.channel_validated or not channel.daily_digest: continue try: channel.send_digest(resource=application, user=self, request=request, since_when=since_when, reports=reports) except IntegrationException as e: log.warning('%s' % e) def latest_events(self): return EventService.latest_for_user(self)