Example #1
0
 def insert(self, colName, document: dict):
     """
     Perform insert action
     :param colName: (str) collection name
     :param document: (dict) document
     :return: (dict)
     """
     res = DotDict({"result": None})
     try:
         collection = self.__dbConn[colName]
         count = collection.insert_one(document)
         res.result = "success"
     except Exception as e:
         res.result = "exception"
     finally:
         return res
Example #2
0
def delete_user_favorite(uid, lecID):
    """
    Delete user's favorite.
    :param uid: (str) user's LINE UID
    :param lecID: (int) lecture ID
    :return: (dict) if success -> "result" would be "success" otherwise error message will be placed here.
    And if success -> "successMsg" will hold succcess message string.
    """
    db = DB()

    res = DotDict({"result": None, "successMsg": None})

    # Check existence
    if not db.exist('userfav', {'$and': [{
            'uid': uid
    }, {
            'lecID': int(lecID)
    }]}):
        res.result = response[3408].format(lecID)
        return res

    query = {'$and': [{'uid': uid}, {'lecID': int(lecID)}]}

    result = db.delete('userfav', query).result
    if result == "success":
        res.result = "success"
        res.successMsg = response[3407].format(uid, lecID)
    elif result == "fail":
        res.result = response[3409].format(lecID)
    else:
        res.result = response[3003].format(uid)

    return res
Example #3
0
 def delete(self, colName, query: dict):
     """
     Perform delete action
     :param colName: (str) collection name
     :param query: (dict) query
     :return: (dict)
     """
     res = DotDict({
         "result": None,
         "count": None,
     })
     try:
         collection = self.__dbConn[colName]
         count = collection.delete_one(query).deleted_count
         res.result = "success" if count > 0 else "fail"
         res.count = count
     except Exception as e:
         res.result = "exception"
     finally:
         return res
Example #4
0
def add_kakomon_url(uid, lecID, url):
    """
    Add kakomon url to merge list.
    :param uid: (str) user's LINE UID
    :param lecID: (int) lecture ID
    :param url: (str) URL
    :return: (dict) if success -> "result" would be "success" otherwise error message will be placed here.
    And if success -> "successMsg" will hold succcess message string.
    """
    db = DB()

    res = DotDict({"result": None, "successMsg": None})

    # URL varidation
    if not re.match("https?://[\w/:%#\$&\?\(\)~\.=\+\-]+", url):
        res.result = response[5003].format(lecID)
        return res

    dates = str(datetime.datetime.now()).replace('.', '/')
    query = {'lecID': int(lecID), 'url': url, 'uid': uid, 'sendTime': dates}

    result = db.insert('urlmerge', query).result
    if result == "success":
        res.result = "success"
        res.successMsg = response[5405].format(lecID)
    else:
        res.result = response[5002].format(uid)

    return res
Example #5
0
def delete_kakomon_url(lecID, url):
    """
    Delete kakomon url from merge list.
    :param lecID: (int) lecture ID
    :param url: (str) url
    :return: (dict) if success -> "result" would be "success" otherwise error message will be placed here.
    And if success -> "successMsg" will hold succcess message string.
    """
    db = DB()

    res = DotDict({"result": None, "successMsg": None})

    # URL varidation
    if not re.match("https?://[\w/:%#\$&\?\(\)~\.=\+\-]+", url):
        res.result = response[5003].format(lecID)
        return res

    # Check existence
    if not db.exist('urlmerge',
                    {'$and': [{
                        'lecID': int(lecID)
                    }, {
                        'url': url
                    }]}):
        res.result = response[5407].format(lecID)
        return res

    query = {'$and': [{'lecID': int(lecID)}, {'url': url}]}

    result = db.delete('urlmerge', query).result
    if result == "success":
        res.result = "success"
        res.successMsg = response[5406].format(lecID, url)
    elif result == "fail":
        res.result = response[5408].format(lecID, url)
    else:
        res.result = response[5004]

    return res
Example #6
0
def get_lecture_by_search_word(search_word):
    """
    Find rakutan info from search word.
    :param search_word: (str) search word
    :return: (dict) if success -> "result" would be "success" otherwise error message will be placed here.
    And if success -> "rakutanList" will hold Rakutan objects list.
    """
    db = DB()

    # if search word has % in first letter, partial match search will be performed
    if search_word[0] == '%':
        query = {
            'lectureName': {
                '$regex': f'{search_word[1:]}',
                '$options': 'i'
            }
        }
    else:
        query = {'lectureName': {'$regex': f'^{search_word}', '$options': 'i'}}

    # result, count, queryResult = db.find('rakutan', query, projection={'_id': False})
    result, count, queryResult = [
        *db.find('rakutan2020', query, projection={
            '_id': False
        }).values()
    ]

    res = DotDict({"result": None, "count": None, "rakutanList": None})

    if result == "success":
        if count == 0:
            res.result = response[2404].format(search_word)
        else:
            res.result = "success"
            res.count = count
            res.rakutanList = Rakutan.from_list(queryResult)
    else:
        res.result = response[2001].format(search_word)

    return res
Example #7
0
def get_kakomon_merge_list():
    """
    Get provided kakomon list.
    :return: (dict) if success -> "result" would be "success" otherwise error message will be placed here.
    And if success -> "kakomonList" will hold Kakomon objects list.
    """
    db = DB()
    query = {'lecID': {'$ne': ''}}
    result, count, queryResult = [*db.find('urlmerge', query).values()]

    res = DotDict({"result": None, "count": None, "kakomonList": None})

    if result == "success":
        if count == 0:
            res.result = response[5404]
        else:
            res.result = "success"
            res.count = count
            res.kakomonList = Kakomon.from_list(queryResult)
    else:
        res.result = response[5001].format(uid)

    return res
Example #8
0
 def find(self, colName, query: dict, projection=None):
     """
     Perform find action
     :param colName: (str) collection name
     :param query: (dict) query
     :param projection: (option) (dict) options to specify field
     :return: (dict)
     """
     res = DotDict({"result": None, "count": None, "queryResult": None})
     try:
         collection = self.__dbConn[colName]
         queryResults = collection.find(filter=query, projection=projection)
         count = collection.count_documents(filter=query)
         res.result = "success"
         res.count = count
         res.queryResult = queryResults
     except Exception as e:
         res.result = "exception"
     finally:
         return res
Example #9
0
def get_user_favorite(uid):
    """
    Get user's favorite.
    :param uid: (str) user's LINE UID
    :return: (dict) if success -> "result" would be "success" otherwise error message will be placed here.
    And if success -> "favList" will hold UserFav objects list.
    """
    db = DB()
    query = {'uid': uid}
    result, count, queryResult = [*db.find('userfav', query).values()]

    res = DotDict({"result": None, "count": None, "favList": None})

    if result == "success":
        if count == 0:
            res.result = response[3404].format(uid)
        else:
            res.result = "success"
            res.count = count
            res.favList = UserFav.from_list(queryResult)
    else:
        res.result = response[3001].format(uid)

    return res
Example #10
0
def get_lecture_by_id(lecID):
    """
    Find rakutan info from lecture ID
    :param lecID: (int) lecture ID
    :return: (dict) if success -> "result" would be "success" otherwise error message will be placed here.
    And if success -> "rakutan" will hold a Rakutan object.
    """
    db = DB()
    query = {'lecID': int(lecID)}
    result, count, queryResult = [*db.find('rakutan2020', query).values()]

    res = DotDict({"result": None, "rakutan": None})

    if result == "success":
        if count == 0:
            res.result = response[1404].format(lecID)
        else:
            res.result = "success"
            res.rakutan = Rakutan.from_dict(queryResult[0])
    else:
        res.result = response[1001].format(lecID)

    return res
Example #11
0
def get_omikuji(omikujiType):
    """
    Get omikuji.
    :param omikujiType: (str) omikuji type. ["normal", "oni"]
    :return: (dict) if success -> "result" would be "success" otherwise error message will be placed here.
    And if success -> "rakutan" will hold a Rakutan object.
    """
    db = DB()

    res = DotDict({"result": None, "rakutan": None})

    if omikujiType == "oni":
        query = {
            '$and': [{
                'facultyName': '国際高等教育院'
            }, {
                'total.0': {
                    '$gt': 4
                }
            }, {
                '$expr': {
                    '$lt': [{
                        '$arrayElemAt': ['$accepted', 0]
                    }, {
                        '$multiply': [0.31, {
                            '$arrayElemAt': ['$total', 0]
                        }]
                    }]
                }
            }]
        }
    elif omikujiType == "normal":
        query = {
            '$and': [{
                'facultyName': '国際高等教育院'
            }, {
                'accepted.0': {
                    '$gt': 15
                }
            }, {
                '$expr': {
                    '$gt': [{
                        '$arrayElemAt': ['$accepted', 0]
                    }, {
                        '$multiply': [0.8, {
                            '$arrayElemAt': ['$total', 0]
                        }]
                    }]
                }
            }]
        }
    else:
        res.result = response[4002].format(omikujiType)
        return res

    result, count, queryResult = [*db.find('rakutan2020', query).values()]

    if result == "success":
        if count == 0:
            res.result = response[4404].format(omikujiType)
        else:
            res.result = "success"
            res.rakutan = random.choice(Rakutan.from_list(queryResult))
    else:
        res.result = response[4001].format(omikujiType)

    return res