redash/models/organizations.py (65 lines of code) (raw):

from sqlalchemy.orm.attributes import flag_modified from sqlalchemy_utils.models import generic_repr from redash.settings.organization import settings as org_settings from .base import db, Column, primary_key from .mixins import TimestampMixin from .types import MutableDict, PseudoJSON from .users import User, Group @generic_repr("id", "name", "slug") class Organization(TimestampMixin, db.Model): SETTING_GOOGLE_APPS_DOMAINS = "google_apps_domains" SETTING_IS_PUBLIC = "is_public" id = primary_key("Organization") name = Column(db.String(255)) slug = Column(db.String(255), unique=True) settings = Column(MutableDict.as_mutable(PseudoJSON)) groups = db.relationship("Group", lazy="dynamic") events = db.relationship("Event", lazy="dynamic", order_by="desc(Event.created_at)") __tablename__ = "organizations" def __str__(self): return "%s (%s)" % (self.name, self.id) @classmethod def get_by_slug(cls, slug): return cls.query.filter(cls.slug == slug).first() @classmethod def get_by_id(cls, _id): return cls.query.filter(cls.id == _id).one() @property def default_group(self): return self.groups.filter( Group.name == "default", Group.type == Group.BUILTIN_GROUP ).first() @property def google_apps_domains(self): return self.settings.get(self.SETTING_GOOGLE_APPS_DOMAINS, []) @property def is_public(self): return self.settings.get(self.SETTING_IS_PUBLIC, False) @property def is_disabled(self): return self.settings.get("is_disabled", False) def disable(self): self.settings["is_disabled"] = True def enable(self): self.settings["is_disabled"] = False def set_setting(self, key, value): if key not in org_settings: raise KeyError(key) self.settings.setdefault("settings", {}) self.settings["settings"][key] = value flag_modified(self, "settings") def get_setting(self, key, raise_on_missing=True): if key in self.settings.get("settings", {}): return self.settings["settings"][key] if key in org_settings: return org_settings[key] if raise_on_missing: raise KeyError(key) return None @property def admin_group(self): return self.groups.filter( Group.name == "admin", Group.type == Group.BUILTIN_GROUP ).first() def has_user(self, email): return self.users.filter(User.email == email).count() == 1