Beispiel #1
0
        return np.array(value)


class Group(Base):
    name = sa.Column(sa.String, unique=True, nullable=False)

    sources = relationship('Source', secondary='group_sources', cascade='all')
    streams = relationship('Stream', secondary='stream_groups', cascade='all',
                           back_populates='groups')
    group_users = relationship('GroupUser', back_populates='group',
                               cascade='all', passive_deletes=True)
    users = relationship('User', secondary='group_users', cascade='all',
                         back_populates='groups')


GroupUser = join_model('group_users', Group, User)
GroupUser.admin = sa.Column(sa.Boolean, nullable=False, default=False)


class Stream(Base):
    name = sa.Column(sa.String, unique=True, nullable=False)
    url = sa.Column(sa.String, unique=True, nullable=False)
    username = sa.Column(sa.String)
    password = sa.Column(sa.String)

    groups = relationship('Group', secondary='stream_groups', cascade='all',
                          back_populates='streams')


StreamGroup = join_model('stream_groups', Stream, Group)
Beispiel #2
0
        else:
            header = None

        return cls(
            obj_id=obj_id,
            instrument_id=instrument_id,
            type=type,
            label=label,
            observed_at=observed_at,
            altdata=header,
            **spec_data,
        )


SpectrumReducer = join_model("spectrum_reducers", Spectrum, User)
SpectrumObserver = join_model("spectrum_observers", Spectrum, User)
SpectrumReducer.create = (
    SpectrumReducer.delete
) = SpectrumReducer.update = AccessibleIfUserMatches('spectrum.owner')
SpectrumObserver.create = (
    SpectrumObserver.delete
) = SpectrumObserver.update = AccessibleIfUserMatches('spectrum.owner')

# should be accessible only by spectrumowner ^^

SpectrumReducer.external_reducer = sa.Column(
    sa.String,
    nullable=True,
    doc="The actual reducer for the spectrum, provided as free text if the "
    "reducer is not a user in the database. Separate from the point-of-contact "
Beispiel #3
0
def update_single_user_group(mapper, connection, target):

    # Update single user group name if needed
    @event.listens_for(DBSession(), "after_flush_postexec", once=True)
    def receive_after_flush(session, context):
        single_user_group = target.single_user_group
        single_user_group.name = slugify(target.username)
        DBSession().merge(single_user_group)


@property
def isadmin(self):
    return "System admin" in self.permissions


User.is_system_admin = isadmin

UserInvitation = join_model("user_invitations", User, Invitation)


@property
def token_groups(self):
    """The groups the Token owner is a member of."""
    return self.created_by.groups


Token.groups = token_groups
Token.accessible_groups = user_or_token_accessible_groups
Token.accessible_streams = user_or_token_accessible_streams
Token.is_system_admin = isadmin
Beispiel #4
0
    streams = relationship('Stream',
                           secondary='stream_groups',
                           back_populates='groups')
    telescopes = relationship('Telescope', secondary='group_telescopes')
    group_users = relationship(
        'GroupUser',
        back_populates='group',
        cascade='save-update, merge, refresh-expire, expunge',
        passive_deletes=True)
    users = relationship('User',
                         secondary='group_users',
                         back_populates='groups')
    filter = relationship("Filter", uselist=False, back_populates="group")


GroupUser = join_model('group_users', Group, User)
GroupUser.admin = sa.Column(sa.Boolean, nullable=False, default=False)


class Stream(Base):
    name = sa.Column(sa.String, unique=True, nullable=False)
    url = sa.Column(sa.String, unique=True, nullable=False)
    username = sa.Column(sa.String)
    password = sa.Column(sa.String)

    groups = relationship('Group',
                          secondary='stream_groups',
                          back_populates='streams')


StreamGroup = join_model('stream_groups', Stream, Group)
Beispiel #5
0
    allocation = relationship('Allocation', back_populates='requests')

    transactions = relationship(
        'FacilityTransaction',
        back_populates='followup_request',
        passive_deletes=True,
        order_by="FacilityTransaction.created_at.desc()",
    )

    target_groups = relationship(
        'Group',
        secondary='request_groups',
        passive_deletes=True,
        doc='Groups to share the resulting data from this request with.',
    )

    photometry = relationship('Photometry', back_populates='followup_request')
    spectra = relationship('Spectrum', back_populates='followup_request')

    @property
    def instrument(self):
        return self.allocation.instrument


FollowupRequestTargetGroup = join_model('request_groups', FollowupRequest,
                                        Group)
FollowupRequestTargetGroup.create = (
    FollowupRequestTargetGroup.update) = FollowupRequestTargetGroup.delete = (
        AccessibleIfUserMatches('followuprequest.requester')
        & FollowupRequestTargetGroup.read)
Beispiel #6
0
    allocations = relationship(
        'Allocation',
        back_populates="group",
        cascade="save-update, merge, refresh-expire, expunge",
        passive_deletes=True,
        doc="Allocations made to this group.",
    )
    admission_requests = relationship(
        "GroupAdmissionRequest",
        back_populates="group",
        passive_deletes=True,
        doc="User requests to join this group.",
    )


GroupUser = join_model('group_users', Group, User)
GroupUser.__doc__ = "Join table mapping `Group`s to `User`s."
GroupUser.admin = sa.Column(
    sa.Boolean,
    nullable=False,
    default=False,
    doc="Boolean flag indicating whether the User is an admin of the group.",
)
GroupUser.can_save = sa.Column(
    sa.Boolean,
    nullable=False,
    server_default="true",
    doc=
    "Boolean flag indicating whether the user should be able to save sources to the group",
)
GroupUser.update = CustomUserAccessControl(groupuser_update_access_logic)
Beispiel #7
0
        'GroupUser',
        back_populates='group',
        cascade='save-update, merge, refresh-expire, expunge',
        passive_deletes=True)

    filter = relationship("Filter", uselist=False, back_populates="group")
    photometry = relationship(
        "Photometry",
        secondary="group_photometry",
        back_populates="groups",
        cascade="save-update, merge, refresh-expire, expunge",
        passive_deletes=True)
    single_user_group = sa.Column(sa.Boolean, default=False)


GroupUser = join_model('group_users', Group, User)
GroupUser.admin = sa.Column(sa.Boolean, nullable=False, default=False)


class Stream(Base):
    name = sa.Column(sa.String, unique=True, nullable=False)
    url = sa.Column(sa.String, unique=True, nullable=False)
    username = sa.Column(sa.String)
    password = sa.Column(sa.String)

    groups = relationship('Group',
                          secondary='stream_groups',
                          back_populates='streams',
                          passive_deletes=True)

Beispiel #8
0
class Project(Base):
    name = sa.Column(sa.String(), nullable=False)
    description = sa.Column(sa.String())
    created = sa.Column(sa.DateTime(), default=datetime.datetime.now)
    cesium_app_id = sa.Column(sa.String())
    users = relationship('User',
                         secondary='user_projects',
                         back_populates='projects')
    datasets = relationship('Dataset', back_populates='project', cascade='all')
    predictions = relationship('Prediction',
                               back_populates='project',
                               cascade='all')


user_projects = join_model('user_projects', User, Project)
User.projects = relationship('Project',
                             secondary='user_projects',
                             back_populates='users',
                             cascade='all')


class Dataset(Base):
    name = sa.Column(sa.String(), nullable=False)
    project_id = sa.Column(sa.ForeignKey('projects.id', ondelete='CASCADE'),
                           nullable=False,
                           index=True)
    project = relationship('Project', back_populates='datasets')
    file_names = sa.Column(sa.ARRAY(sa.VARCHAR()), nullable=False, index=True)
    meta_features = sa.Column(sa.ARRAY(sa.VARCHAR()),
                              nullable=False,
Beispiel #9
0
from .comment import CommentOnSpectrum
from .annotation import AnnotationOnSpectrum
from .comment import CommentOnGCN
from .comment import CommentOnShift
from .invitation import Invitation
from .source_notification import SourceNotification
from .filter import Filter
from .stream import Stream, StreamUser
from .survey_efficiency import (
    SurveyEfficiencyForObservations,
    SurveyEfficiencyForObservationPlan,
)
from .group import Group, accessible_by_group_admins, accessible_by_group_members
from .analysis import AnalysisService, ObjAnalysis

GroupObjAnalysis = join_model("group_obj_analyses", Group, ObjAnalysis)
GroupObjAnalysis.__doc__ = "Join table mapping Groups to ObjAnalysis."
GroupObjAnalysis.delete = GroupObjAnalysis.update = (accessible_by_group_admins
                                                     & GroupObjAnalysis.read)

GroupAnalysisService = join_model("group_analysisservices", Group,
                                  AnalysisService)
GroupAnalysisService.__doc__ = "Join table mapping Groups to Analysis Services."
GroupAnalysisService.delete = GroupAnalysisService.update = (
    accessible_by_group_admins & GroupAnalysisService.read)

GroupTaxonomy = join_model("group_taxonomy", Group, Taxonomy)
GroupTaxonomy.__doc__ = "Join table mapping Groups to Taxonomies."
GroupTaxonomy.delete = GroupTaxonomy.update = (accessible_by_group_admins
                                               & GroupTaxonomy.read)
Beispiel #10
0
            sa.literal(
                user_or_token.is_admin)).join(
                    User, cls.user).outerjoin(
                        Group, User.groups).outerjoin(
                            GroupStream,
                            sa.and_(
                                GroupStream.group_id == Group.id,
                                GroupStream.stream_id == cls.stream_id,
                            ),
                        ).group_by(cls.id)
        # no OR here because Users will always be a member of at least one
        # group -- their single user group.
        .having(sa.func.bool_and(GroupStream.stream_id.is_(None))))


StreamUser = join_model('stream_users', Stream, User)
StreamUser.__doc__ = "Join table mapping Streams to Users."
StreamUser.create = restricted
# only system admins can modify user stream permissions
# only system admins can modify user stream permissions
StreamUser.delete = CustomUserAccessControl(stream_delete_logic)

StreamPhotometry = join_model("stream_photometry", Stream, Photometry)
StreamPhotometry.__doc__ = "Join table mapping Streams to Photometry."
StreamPhotometry.create = accessible_by_stream_members

StreamPhotometricSeries = join_model("stream_photometric_series", Stream,
                                     PhotometricSeries)
StreamPhotometricSeries.__doc__ = "Join table mapping Streams to PhotometricSeries."
StreamPhotometricSeries.create = accessible_by_stream_members
Beispiel #11
0
import sqlalchemy as sa
from sqlalchemy.orm import relationship
from sqlalchemy import func

from baselayer.app.models import (
    DBSession,
    join_model,
    UserAccessControl,
    CustomUserAccessControl,
)

from .obj import Obj
from .group import Group, GroupUser, accessible_by_group_members


Source = join_model("sources", Group, Obj)

# This relationship is defined here to prevent a circular import.
# Please see obj.py for other Obj relationships.
Obj.sources = relationship(
    Source,
    back_populates='obj',
    cascade='delete',
    passive_deletes=True,
    doc="Instances in which a group saved this Obj.",
)


def source_create_access_logic(cls, user_or_token):
    user_id = UserAccessControl.user_id_from_user_or_token(user_or_token)
    query = DBSession().query(cls)
Beispiel #12
0
        'CommentOnShift',
        back_populates='shift',
        cascade='save-update, merge, refresh-expire, expunge, delete',
        passive_deletes=True,
        order_by="CommentOnShift.created_at",
        doc="Comments posted about this Shift.",
    )

    required_users_number = sa.Column(
        sa.Integer,
        nullable=True,
        doc='The number of users required to join this shift for it to be considered full',
    )


ShiftUser = join_model('shift_users', Shift, User)
ShiftUser.__doc__ = "Join table mapping `Shift`s to `User`s."
ShiftUser.admin = sa.Column(
    sa.Boolean,
    nullable=False,
    default=False,
    doc="Boolean flag indicating whether the User is an admin of the shift.",
)
# add a column that is a boolean saying if a user needs a replacement for the shift
ShiftUser.needs_replacement = sa.Column(
    sa.Boolean,
    nullable=False,
    default=False,
    doc="Boolean flag indicating whether the User needs a replacement for the shift.",
)
Beispiel #13
0
    name = sa.Column(sa.String(), nullable=False)
    description = sa.Column(sa.String())
    users = relationship('User', secondary='user_projects',
                         back_populates='projects')
    datasets = relationship('Dataset', back_populates='project',
                            cascade='all')
    featuresets = relationship('Featureset', back_populates='project',
                               cascade='all')
    models = relationship('Model', back_populates='project', cascade='all')
    predictions = relationship('Prediction', back_populates='project',
                               cascade='all')


User.projects = relationship('Project', secondary='user_projects',
                             back_populates='users', cascade='all')
UserProjects = join_model('user_projects', User, Project)


class Featureset(Base):
    project_id = sa.Column(sa.ForeignKey('projects.id', ondelete='CASCADE'),
                           nullable=False, index=True)
    project = relationship('Project', back_populates='featuresets')
    dataset_id = sa.Column(sa.ForeignKey('datasets.id'))
    dataset = relationship('Dataset')
    name = sa.Column(sa.String(), nullable=False)
    features_list = sa.Column(sa.ARRAY(sa.VARCHAR()), nullable=False, index=True)
    custom_features_script = sa.Column(sa.String())
    file_uri = sa.Column(sa.String(), nullable=True, index=True)
    task_id = sa.Column(sa.String())
    finished = sa.Column(sa.DateTime)
Beispiel #14
0
from baselayer.app.models import DBSession, restricted, CustomUserAccessControl
from .photometry import Photometry
from .taxonomy import Taxonomy
from .comment import Comment
from .annotation import Annotation
from .classification import Classification
from .spectrum import Spectrum
from .comment import CommentOnSpectrum
from .annotation import AnnotationOnSpectrum
from .invitation import Invitation
from .source_notification import SourceNotification
from .filter import Filter
from .stream import Stream, StreamUser
from .group import Group, accessible_by_group_admins, accessible_by_group_members

GroupTaxonomy = join_model("group_taxonomy", Group, Taxonomy)
GroupTaxonomy.__doc__ = "Join table mapping Groups to Taxonomies."
GroupTaxonomy.delete = GroupTaxonomy.update = (accessible_by_group_admins
                                               & GroupTaxonomy.read)

GroupComment = join_model("group_comments", Group, Comment)
GroupComment.__doc__ = "Join table mapping Groups to Comments."
GroupComment.delete = GroupComment.update = (accessible_by_group_admins
                                             & GroupComment.read)

GroupAnnotation = join_model("group_annotations", Group, Annotation)
GroupAnnotation.__doc__ = "Join table mapping Groups to Annotation."
GroupAnnotation.delete = GroupAnnotation.update = (accessible_by_group_admins
                                                   & GroupAnnotation.read)

GroupClassification = join_model("group_classifications", Group,
Beispiel #15
0
        doc='Groups to share the resulting data from this request with.',
    )

    transactions = relationship(
        'FacilityTransaction',
        back_populates='observation_plan_request',
        passive_deletes=True,
        order_by="FacilityTransaction.created_at.desc()",
    )

    @property
    def instrument(self):
        return self.allocation.instrument


ObservationPlanRequestTargetGroup = join_model('observationplan_groups',
                                               ObservationPlanRequest, Group)
ObservationPlanRequestTargetGroup.create = (
    ObservationPlanRequestTargetGroup.update
) = ObservationPlanRequestTargetGroup.delete = (
    AccessibleIfUserMatches('followuprequest.requester')
    & ObservationPlanRequestTargetGroup.read)


class EventObservationPlan(Base):
    """Tiling information, including the event time, localization ID, tile IDs,
    and plan name"""

    observation_plan_request_id = sa.Column(
        sa.ForeignKey('observationplanrequests.id', ondelete="CASCADE"),
        nullable=False,
        doc='ObservationPlanRequest ID',
Beispiel #16
0
                                            ondelete='CASCADE'),
                              nullable=False,
                              index=True)
    allocation = relationship('Allocation',
                              back_populates='default_observation_plans')

    target_groups = relationship(
        'Group',
        secondary='default_observationplan_groups',
        passive_deletes=True,
        doc=
        'Groups to share the resulting data from this default request with.',
    )


DefaultObservationPlanRequestTargetGroup = join_model(
    'default_observationplan_groups', DefaultObservationPlanRequest, Group)
DefaultObservationPlanRequestTargetGroup.create = (
    DefaultObservationPlanRequestTargetGroup.update
) = DefaultObservationPlanRequestTargetGroup.delete = (
    AccessibleIfUserMatches('defaultobservationplanrequest.requester')
    & DefaultObservationPlanRequestTargetGroup.read)


class ObservationPlanRequest(Base):
    """A request for an EventObservationPlan."""

    # TODO: Make read-accessible via target groups
    create = read = AccessibleIfRelatedRowsAreAccessible(gcnevent="read",
                                                         allocation="read")
    update = delete = (
        (AccessibleIfUserMatches('allocation.group.users')