예제 #1
0
class InventoryItem(db.Document):
    # constants
    CHECKED_IN = 1
    CHECKED_OUT = 2
    # fields
    group = db.ReferenceField(InventoryGroup, dbref=True)
    name = db.StringField(max_length=255)
    identifier = db.StringField(max_length=500)
    comment = db.StringField(max_length=200)
    date_added = db.DateTimeField()
    date_updated = db.DateTimeField()
    status = db.IntField(default=1, choices=INVENTORY_STATUS)
    meta = {'ordering': ['name']}

    def __unicode__(self):
        return self.name

    def get_latest_log(self):
        """Return the latest log for this item"""
        try:
            log = InventoryLog.objects(
                item=self).order_by('-date_added').first()
            if not log:
                return None
        except InventoryLog.DoesNotExist:
            return None
        return log

    def get_latest_person(self):
        """Return the latest person for this item"""
        log = self.get_latest_log()
        if not log:
            return None
        return log.person
예제 #2
0
class Post(db.Document):
    slug = db.StringField(required=True, max_length=20, unique=True)
    creator = db.StringField(required=True, max_length=20)
    title = db.StringField(required=True, max_length=50)
    created_at = db.DateTimeField()
    comments = db.ListField()
    rates = db.ListField()
예제 #3
0
class UserLocation(db.EmbeddedDocument):
    date = db.DateTimeField(default=datetime.datetime.utcnow)
    position = db.GeoPointField()
    duration = db.IntField(default=0)

    def __str__(self):
        return str(self.position.join(','))
예제 #4
0
class Spot(db.Document):
    name = db.StringField(required=True)
    user = db.ReferenceField(User)
    location = GeoPointField(required=True)
    wifi = db.IntField(min_value=0, max_value=5)
    power = db.BooleanField()
    category = db.StringField()
    comments = db.ListField(db.StringField())
    creation_date = db.DateTimeField(default=datetime.datetime.utcnow)
    user_url = db.StringField()

    meta = {
        'ordering': ['-creation_date']
    }

    def __str__(self):
        return self.name

    def to_dict(self):
        data = self.to_mongo()
        data['creation_date'] = str(self.creation_date.timestamp())
        data['id'] = str(self.id)
        del data['_id']
        data['user'] = str(data['user'])
        return data

    def to_json(self):
        return json.dumps(self.to_dict())
예제 #5
0
class User(UserMixin, db.Document):
    email = db.EmailField(unique=True)
    password = db.StringField(required=True, min_length=32, max_length=120)
    creation_date = db.DateTimeField(default=datetime.datetime.utcnow)
    username = db.StringField(unique=True, required=True)
    about = db.StringField()
    slug = db.StringField(unique=True)
    locations = db.EmbeddedDocumentListField(UserLocation, default=[])
    allow_community = db.BooleanField()
    current_location = GeoPointField()
    socials = db.DictField()
    image_path = db.ImageField(size=(600, 400), thumbnail=(200, 200))

    def set_password(self, password):
        self.password = generate_password_hash(password)
        return self

    def check_password(self, password):
        return check_password_hash(self.password, password)

    @property
    def avatar(self):
        return '{}/{}'.format(app.config.get('AVATARS_URL'), self.id)

    @property
    def has_avatar(self):
        return bool(self.image_path)

    def clean_about(self):
        self.about = (Markup(self.about.replace('<br>', '\^n^'))
                      .striptags().replace('\^n^', '\n'))

    def __str__(self):
        return str(self.username or 'Unknown')

    def to_dict(self):
        data = self.to_mongo()
        data['id'] = str(self.id)
        del data['_id']
        del data['password']
        return data

    def save(self, *args, **kwargs):
        if self.slug is None:
            try:
                User.objects.get(username=self.username)
                # If the code above is reach on the block try, it means that
                # there is a duplicate
                self.username = uniquify_username(self.username)
            except User.DoesNotExist:
                pass
        self.slug = slugify(self.username)
        return super().save(*args, **kwargs)

    meta = {'ordering': ['-creation_date']}
예제 #6
0
class Application(db.Document):
    """An application."""

    submitter = db.ReferenceField(User)
    is_submitted = db.BooleanField(default=False)
    submit_date = db.DateTimeField()

    course_applications = db.EmbeddedDocumentListField(CourseApplication)
    taking_ap_courses = db.BooleanField(default=False)
    current_ap_courses = db.StringField(default='')
    test_scores = db.StringField(default='')
    teacher_recs = db.EmbeddedDocumentListField(TeacherRec)
    confirm_contacted_teachers = db.BooleanField(default=False)
예제 #7
0
class Spot(db.Document):
    name = db.StringField(required=True)
    user = db.ReferenceField(User)
    location = db.GeoPointField(required=True)
    wifi = db.IntField(min_value=0, max_value=5)
    power = db.BooleanField()
    category = db.StringField()
    comments = db.ListField(db.StringField())
    creation_date = db.DateTimeField(default=datetime.datetime.utcnow)

    meta = {'ordering': ['-creation_date']}

    def __str__(self):
        return self.name
예제 #8
0
class User(db.Document):
    name = db.StringField(
        required=True,
        max_length=20,
        unique=True,
    )
    password = db.StringField(required=True)
    actions_performed = db.IntField()
    cooldown_started = db.DateTimeField()

    @staticmethod
    def generate_hash(password):
        return sha256.hash(password)

    @staticmethod
    def verify_hash(password, hash):
        return sha256.verify(password, hash)
예제 #9
0
class Article(db.Document):
    title = db.StringField(required=True)
    content = db.StringField(required=True)
    creation_date = db.DateTimeField(default=datetime.datetime.utcnow)
    slug = db.StringField(required=True, default='no-title')
    author = db.ReferenceField(User, reverse_delete_rule='NULLIFY')
    language = db.StringField(min_length=2, max_length=2, default='en')
    images = db.ListField()
    publication_date = db.DateTimeField()
    published = db.BooleanField(default=False)

    def __str__(self):
        return str(self.title)

    def get_author(self):
        try:
            return self.author
        except DoesNotExist:
            return User.objects.get(slug='neomad')

    def extract_images(self):
        """
        Extract images from the content, resize and save them locally if they
        are base64 encoded.
        Saves the list of images into the images list property.
        """
        html = BeautifulSoup(self.content, 'html.parser')
        images = []
        try:
            os.makedirs(self.get_images_path())
        except FileExistsError:
            pass
        for img in html.find_all('img'):
            data = img.get('src')
            if is_base64(data):
                m = hashlib.md5()
                m.update(data.encode('utf-8'))
                img_name = m.hexdigest()
                img_path = '{}/{}'.format(self.get_images_path(), img_name)
                img_url = '{}/{}'.format(self.get_images_url(), img_name)
                save_base64_image(data, img_path, (1000, 800))
                img['src'] = img_url
                images.append(img_url)
            else:
                images.append(data)
        for outdated_image in set(self.images) - set(images):
            os.remove(
                os.path.join(self.get_images_path(),
                             os.path.basename(outdated_image)))
        self.images = images

    def get_images_path(self):
        return '{}/{}'.format(app.config['ARTICLE_IMG_PATH'], self.id)

    def get_images_url(self):
        return '{}/{}'.format(app.config['ARTICLE_IMG_URL'], self.id)

    @property
    def image(self):
        if len(self.images):
            return self.images[0]

    def delete(self, *args, **kwargs):
        parent = super(Article, self).delete(*args, **kwargs)
        path = self.get_images_path()
        shutil.rmtree(path)
        return parent

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        is_new = not self.id
        # when new, the id must exist before extracting images
        if is_new:
            super(Article, self).save(*args, **kwargs)
        self.extract_images()
        self.title = Markup(self.title).striptags()
        self.content = clean_html(self.content, ALLOWED_TAGS)
        self.language = detect(self.content)
        morph = self.morph()
        if self != morph:
            morph.pre_save(*args, **kwargs)
        return super(Article, self).save(*args, **kwargs)

    def morph(self):
        if (self.content and 'https://steemit.com/' in self.content):
            match = re.match('.*(https://steemit.com/[^<\s.]*)', self.content)
            url = match.groups()[0]
            return SteemitArticle(article=self, url=url)
        return self

    meta = {
        'ordering': ['-publication_date'],
        'indexes': ['-publication_date']
    }
예제 #10
0
class InventoryLog(db.Document):
    person = db.ReferenceField(Person, dbref=True)
    item = db.ReferenceField(InventoryItem, dbref=True)
    status = db.IntField(default=2, choices=INVENTORY_STATUS)
    date_added = db.DateTimeField(default=datetime.now)
    checkout_meta = db.EmbeddedDocumentField(CheckoutMeta)
    meta = {'ordering': ['-date_added']}
    person_name = db.StringField(max_length=250)

    def __unicode__(self):
        return u'%s - %s' % (self.status, self.date_added)

    @classmethod
    def add_log(cls, person, item, status, checkout_meta, **kwargs):
        log = InventoryLog(person=person,
                           item=item,
                           status=int(status),
                           date_added=datetime.now(),
                           checkout_meta=checkout_meta)
        if person.name:
            log.person_name = kwargs.get('person_name', person.name)
        log.save()
        return log

    def get_person_name(self):
        """Returns the name of the person assigned to this log"""
        if isinstance(self.person, Person):
            return self.person.name
        # return known/alt person name
        return self.person_name

    def get_checkout_description(self):
        """Returns a human-readable description for the checkout"""
        name = u''
        if not self.checkout_meta:
            return name
        # no duration, then assume default
        duration = self.checkout_meta.duration
        if not duration:
            return u'soon'
        # determine name of duration
        dtype = self.checkout_meta.duration_type
        if dtype == CheckoutMeta.DURATION_TYPE_UNKNOWN:
            return u'soon'
        elif dtype == CheckoutMeta.DURATION_TYPE_MINS:
            name = u'min'
        elif dtype == CheckoutMeta.DURATION_TYPE_HOURS:
            name = u'hr'
        elif dtype == CheckoutMeta.DURATION_TYPE_DAYS:
            name = u'day'
        # format OOO
        ooo_str = ''
        if self.checkout_meta.is_ooo:
            ooo_str = ' OOO'
        # pluralize name
        if duration > 1:
            name += u's'
        description = u'{duration:.0f} {dname}{ooo}'.format(duration=duration,
                                                            dname=name,
                                                            ooo=ooo_str)
        return description

    def get_date_added(self):
        """Returns a formatted date added value"""
        # ref: http://docs.python.org/2/library/time.html#time.strftime
        return self.date_added.strftime(
            settings.INVENTORY_CHECKOUT_DATE_FORMAT)
예제 #11
0
class Article(db.Document):
    title = db.StringField(required=True)
    content = db.StringField(required=True)
    creation_date = db.DateTimeField(default=datetime.datetime.utcnow)
    slug = db.StringField(required=True, default='no-title')
    author = db.ReferenceField(User)
    language = db.StringField(min_length=2, max_length=2, default='en')
    images = db.ListField()

    def __str__(self):
        return str(self.title)

    def extract_images(self):
        """
        Extract images from the content, resize and save them locally if they
        are base64 encoded.
        Saves the list of images into the images list property.
        """
        html = BeautifulSoup(self.content, 'html.parser')
        images = []
        try:
            os.makedirs(self.get_images_path())
        except FileExistsError:
            pass
        for img in html.find_all('img'):
            data = img.get('src')
            if is_base64(data):
                m = hashlib.md5()
                m.update(data.encode('utf-8'))
                img_name = m.hexdigest()
                img_path = '{}/{}'.format(self.get_images_path(), img_name)
                img_url = '{}/{}'.format(self.get_images_url(), img_name)
                save_base64_image(data, img_path, (1000, 800))
                img['src'] = img_url
                images.append(img_url)
            else:
                images.append(data)
            self.images = images
        self.content = str(html)

    def get_images_path(self):
        return '{}/{}'.format(app.config['ARTICLE_IMG_PATH'], self.id)

    def get_images_url(self):
        return '{}/{}'.format(app.config['ARTICLE_IMG_URL'], self.id)

    @property
    def image(self):
        if len(self.images):
            return self.images[0]

    def delete(self, *args, **kwargs):
        parent = super(Article, self).delete(*args, **kwargs)
        path = self.get_images_path()
        shutil.rmtree(path)
        return parent

    def save(self, *args, **kwargs):
        if not self.creation_date:
            self.creation_date = datetime.datetime.utcnow()
        self.slug = slugify(self.title)
        is_new = not self.id
        # when new, the id must exist before extracting images
        if is_new:
            super(Article, self).save(*args, **kwargs)
        self.extract_images()
        self.title = Markup(self.title).striptags()
        self.content = clean_html(self.content, ALLOWED_TAGS)
        self.language = detect(self.content)
        return super(Article, self).save(*args, **kwargs)

    meta = {'ordering': ['-creation_date']}