# -*- 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 uuid import logging import sqlalchemy as sa from appenlight.models.resource import Resource from sqlalchemy.orm import aliased log = logging.getLogger(__name__) def generate_api_key(): uid = str(uuid.uuid4()).replace('-', '') return uid[0:32] class Application(Resource): """ Resource of application type """ __tablename__ = 'applications' __mapper_args__ = {'polymorphic_identity': 'application'} # lists configurable possible permissions for this resource type __possible_permissions__ = ('view', 'update_reports') resource_id = sa.Column(sa.Integer(), sa.ForeignKey('resources.resource_id', onupdate='CASCADE', ondelete='CASCADE', ), primary_key=True, ) domains = sa.Column(sa.UnicodeText(), nullable=False, default='') api_key = sa.Column(sa.String(32), nullable=False, unique=True, index=True, default=generate_api_key) public_key = sa.Column(sa.String(32), nullable=False, unique=True, index=True, default=generate_api_key) default_grouping = sa.Column(sa.Unicode(20), nullable=False, default='url_traceback') error_report_threshold = sa.Column(sa.Integer(), default=10) slow_report_threshold = sa.Column(sa.Integer(), default=10) allow_permanent_storage = sa.Column(sa.Boolean(), default=False, nullable=False) @sa.orm.validates('default_grouping') def validate_default_grouping(self, key, grouping): """ validate if resouce can have specific permission """ assert grouping in ['url_type', 'url_traceback', 'traceback_server'] return grouping report_groups = sa.orm.relationship('ReportGroup', cascade="all, delete-orphan", passive_deletes=True, passive_updates=True, lazy='dynamic', backref=sa.orm.backref('application', lazy="joined")) postprocess_conf = sa.orm.relationship('ApplicationPostprocessConf', cascade="all, delete-orphan", passive_deletes=True, passive_updates=True, backref='resource') logs = sa.orm.relationship('Log', lazy='dynamic', backref='application', passive_deletes=True, passive_updates=True, ) integrations = sa.orm.relationship('IntegrationBase', backref='resource', cascade="all, delete-orphan", passive_deletes=True, passive_updates=True, ) def generate_api_key(self): return generate_api_key() def after_update(mapper, connection, target): from appenlight.models.services.application import ApplicationService log.info('clearing out ApplicationService cache') ApplicationService.by_id_cached().invalidate(target.resource_id) ApplicationService.by_api_key_cached().invalidate(target.api_key) sa.event.listen(Application, 'after_update', after_update) sa.event.listen(Application, 'after_delete', after_update)