salvoventura/pypexels

View on GitHub
pypexels/src/models.py

Summary

Maintainability
A
0 mins
Test Coverage
###############################################################################
#    Copyright (c) 2017 Salvatore Ventura <salvoventura@gmail.com>
#
#      File: models.py
#
#    Author: Salvatore Ventura <salvoventura@gmail.com>
#      Date: 27 Sep 2017
#   Purpose: Data models for parsing data
#
#      Date: 08 May 2020
#  Revision: 2
#   Comment: What's new in revision 2
#            BaseModel parser class
#            Video and Photo, inherit from BaseModel
#
#  Revision: 1
#   Comment: What's new in revision 1
#            Parse Photo
#
###############################################################################


class BaseModel(object):

    @classmethod
    def parse(cls, data):
        """
        Converts JSON structure into BaseModel object where
        each JSON key,value has become a BaseModel property
        This is up to the first level.

        :param data: json body of a single entry
        :return: BaseModel object
        """
        data = data or {}
        base_object = cls() if data else None
        for key, value in data.items():
            setattr(base_object, key, value)
        return base_object

    def __eq__(self, id):
        return self.id == id

    def __hash__(self):
        return hash(self.id)


class Photo(BaseModel):
    def get_attribution(self, _format='txt'):
        if _format == 'txt':
            return 'Photo by {} from Pexels'.format(self.photographer)

        if _format == 'html':
            return '<div>' \
                   'Photo by ' \
                   '<strong>' \
                   '<a href="{}>{}</a>' \
                   '</strong> from <strong>' \
                   '<a href="{}">Pexels</a></strong>' \
                   '</div>'.format(self.photographer_url, self.photographer, self.url)


class Video(BaseModel):
    def get_attribution(self, _format='str'):
        if _format == 'str':
            return 'Video by {} from Pexels'.format(self.user.get('name', ''))

        if _format == 'html':
            user_name = self.user.get('name', '')
            user_url = self.user.get('url', '')

            return '<div>' \
                   'Video by ' \
                   '<strong>' \
                   '<a href="{}>{}</a>' \
                   '</strong> from <strong>' \
                   '<a href="{}">Pexels</a></strong>' \
                   '</div>'.format(user_url, user_name, self.url)