class Flag(BaseModel): id = db.Column(db.Integer, primary_key=True, nullable=False) annotator_id = db.Column(db.Integer, db.ForeignKey('annotator.id')) annotator = db.relationship('Annotator', foreign_keys=[annotator_id], uselist=False) item_id = db.Column(db.Integer, db.ForeignKey('item.id')) item = db.relationship('Item', foreign_keys=[item_id], uselist=False) reason = db.Column(db.Text, nullable=False) resolved = db.Column(db.Boolean, default=False, nullable=False) time = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) _default_fields = ["annotator_id", "item_id", "reason", "resolved", "time"] relations_keys = ("item", "annotator") def __init__(self, annotator, item, reason): self.annotator = annotator self.item = item self.reason = reason def __repr__(self): return '<Flag %r>' % self.id @classmethod def by_id(cls, uid): if uid is None: return None try: flag = cls.query.with_for_update().get(uid) except NoResultFound: flag = None return flag
class Annotator(BaseModel): id = db.Column(db.Integer, primary_key=True, nullable=False) name = db.Column(db.String(120), nullable=False) email = db.Column(db.String(120), nullable=False) active = db.Column(db.Boolean, default=True, nullable=False) stop_next = db.Column(db.Boolean, default=False, nullable=False) read_welcome = db.Column(db.Boolean, default=False, nullable=False) description = db.Column(db.Text, nullable=False) secret = db.Column(db.String(32), unique=True, nullable=False) next_id = db.Column(db.Integer, db.ForeignKey('item.id')) next = db.relationship('Item', foreign_keys=[next_id], uselist=False) updated = db.Column(db.DateTime) prev_id = db.Column(db.Integer, db.ForeignKey('item.id')) prev = db.relationship('Item', foreign_keys=[prev_id], uselist=False) ignore = db.relationship('Item', secondary=ignore_table) alpha = db.Column(db.Float) beta = db.Column(db.Float) _default_fields = [ "name", "email", "active", "stop_next", "read_welcome", "description", "next_id", "prev_id", "ignore", "updated" ] _secret_fields = ["secret"] relations_keys = ("next", "prev", "ignore") def __init__(self, name, email, description): self.name = name self.email = email self.description = description self.alpha = crowd_bt.ALPHA_PRIOR self.beta = crowd_bt.BETA_PRIOR self.secret = utils.gen_secret(32) def update_next(self, new_next): if new_next is not None: new_next.prioritized = False # it's now assigned, so cancel the prioritization # it could happen that the judge skips the project, but that # doesn't re-prioritize the project self.updated = datetime.utcnow() self.next = new_next @classmethod def by_secret(cls, secret): try: annotator = cls.query.filter(cls.secret == secret).one() except NoResultFound: annotator = None return annotator @classmethod def by_id(cls, uid): if uid is None: return None try: annotator = cls.query.with_for_update().get(uid) except NoResultFound: annotator = None return annotator
class ItemCategory(db.Model): id = db.Column('id', db.Integer, primary_key=True) item_id = db.Column(db.Integer, db.ForeignKey('item.id')) category_id = db.Column(db.Integer, db.ForeignKey('category.id')) mu = db.Column(db.Float) sigma_sq = db.Column(db.Float) prioritized = db.Column(db.Boolean, default=False, nullable=False) viewed = db.relationship('Annotator', secondary=view_table) item = db.relationship('Item') category = db.relationship('Category') def __init__(self, item_id, category_id): self.item_id = item_id self.category_id = category_id self.mu = crowd_bt.MU_PRIOR self.sigma_sq = crowd_bt.SIGMA_SQ_PRIOR @classmethod def by_id(cls, uid): if uid is None: return None try: annotator = cls.query.with_for_update().get(uid) except NoResultFound: annotator = None return annotator
class Decision(db.Model): id = db.Column(db.Integer, primary_key=True, nullable=False) annotator_id = db.Column(db.Integer, db.ForeignKey('annotator.id')) annotator = db.relationship('Annotator', foreign_keys=[annotator_id], uselist=False) winner_id = db.Column(db.Integer, db.ForeignKey('item.id')) winner = db.relationship('Item', foreign_keys=[winner_id], uselist=False) loser_id = db.Column(db.Integer, db.ForeignKey('item.id')) loser = db.relationship('Item', foreign_keys=[loser_id], uselist=False) time = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) def __init__(self, annotator, winner, loser): self.annotator = annotator self.winner = winner self.loser = loser
class Feedback(db.Model): id = db.Column(db.Integer, primary_key=True, nullable=False) annotator_id = db.Column(db.Integer, db.ForeignKey('annotator.id')) annotator = db.relationship('Annotator', foreign_keys=[annotator_id], uselist=False) item_id = db.Column(db.Integer, db.ForeignKey('item.id')) item = db.relationship('Item', foreign_keys=[item_id], uselist=False) feedback_type = db.Column(db.String(10)) feedback = db.Column(db.String(250)) time = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) def __init__(self, annotator, item, feedback_type, feedback): self.annotator = annotator self.item = item self.feedback_type = feedback_type self.feedback = feedback
from gavel.models import db import gavel.crowd_bt as crowd_bt from sqlalchemy.orm.exc import NoResultFound from urllib.parse import urlparse from urllib.parse import parse_qs view_table = db.Table( 'view', db.Column('item_id', db.Integer, db.ForeignKey('item.id')), db.Column('annotator_id', db.Integer, db.ForeignKey('annotator.id'))) class Item(db.Model): id = db.Column(db.Integer, primary_key=True, nullable=False) name = db.Column(db.Text, nullable=False) location = db.Column(db.Text, nullable=False) description = db.Column(db.Text, nullable=False) active = db.Column(db.Boolean, default=True, nullable=False) viewed = db.relationship('Annotator', secondary=view_table) prioritized = db.Column(db.Boolean, default=False, nullable=False) mu = db.Column(db.Float) sigma_sq = db.Column(db.Float) def __init__(self, name, location, description): self.name = name self.location = location self.description = description self.mu = crowd_bt.MU_PRIOR self.sigma_sq = crowd_bt.SIGMA_SQ_PRIOR @classmethod
from gavel.models import db from gavel.models.category import Category import gavel.crowd_bt as crowd_bt from sqlalchemy.orm.exc import NoResultFound view_table = db.Table('view', db.Column('item_category_id', db.Integer, db.ForeignKey('item_category.id')), db.Column('annotator_id', db.Integer, db.ForeignKey('annotator.id')) ) class ItemCategory(db.Model): id = db.Column('id', db.Integer, primary_key=True) item_id = db.Column(db.Integer, db.ForeignKey('item.id')) category_id = db.Column(db.Integer, db.ForeignKey('category.id')) mu = db.Column(db.Float) sigma_sq = db.Column(db.Float) prioritized = db.Column(db.Boolean, default=False, nullable=False) viewed = db.relationship('Annotator', secondary=view_table) item = db.relationship('Item') category = db.relationship('Category') def __init__(self, item_id, category_id): self.item_id = item_id self.category_id = category_id self.mu = crowd_bt.MU_PRIOR self.sigma_sq = crowd_bt.SIGMA_SQ_PRIOR @classmethod def by_id(cls, uid):