Browse Source

gamification: badges & ranking

aguryev 3 years ago
parent
commit
ad5671fb32

+ 6 - 6
app.py

@@ -1,18 +1,17 @@
 from polzybackend import create_app
 import os
 from clauses import bp as clauses_bp
-from logo import bp as logo_bp
+from endpoints import bp as ep_bp
 
 
 class Config(object):
 
     SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(os.path.abspath(os.path.dirname(__file__)), 'polzy.db')
-    METHOD_GET_STAGES = 'pms.Stages'
+    CLASSNAME_STAGES = 'pms.Stages'
     CLASSNAME_PRODUCTS = 'pms.fast_offer.Products'
     CLASSNAME_POLICY = 'policy.SamplePolicy'
     CLASSNAME_ANTRAG = 'antrag.SampleAntrag'
-
-    # HOST = 'http://localhost:5000'
+    CLASSNAME_GAMIFICATION_HITLIST = 'gamification.HitList'
 
     # flask dashboard
     DASHBOARD_CONFIG = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'dashboard.cfg')
@@ -22,12 +21,13 @@ class Config(object):
 
     MEDIA = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'media')
     LOGO = os.path.join(MEDIA, 'logo')
-    LOGO_URI = 'logo'
+    BADGES = os.path.join(MEDIA, 'badges')
+
 
 
 app = create_app(Config)
 app.register_blueprint(clauses_bp)
-app.register_blueprint(logo_bp)
+app.register_blueprint(ep_bp)
 
 
 from werkzeug.middleware.dispatcher import DispatcherMiddleware

+ 1 - 1
logo/__init__.py

@@ -1,5 +1,5 @@
 from flask import Blueprint
 
-bp = Blueprint('logo', __name__)
+bp = Blueprint('end-points', __name__)
 
 from . import routes

+ 29 - 1
logo/routes.py

@@ -16,6 +16,10 @@ default_logo = {
 @bp.route('/logo/<string:filename>')
 @bp.route('/logo/default/<string:target>')
 def logo(filename=None, target=None):
+    #
+    # returns img from media/logo
+    #
+
     current_app.logger.info(f"In Logo-Endpoint for filename: {filename}, target: {target}")
     if filename:
         path_to_file = os.path.join(current_app.config['LOGO'], filename)
@@ -28,4 +32,28 @@ def logo(filename=None, target=None):
     return send_file(
         path_to_file,
         attachment_filename=filename,
-    )
+    )
+
+
+@bp.route('/badge/<string:type>')
+@bp.route('/badge/<string:type>/<string:level>')
+def badge_image(type, level=None):
+    #
+    # returns img from media/badges
+    #
+
+    if level:
+        filename = f'{type}_{level}.png'
+    else:
+        filename = f'{type}.png'
+
+    path_to_file = os.path.join(current_app.config['BADGES'], filename)
+
+    # check if file not exists 
+    if not os.path.isfile(path_to_file):
+        path_to_file = os.path.join(current_app.config['BADGES'], f'default_{level}.png')
+
+    return send_file(
+        path_to_file,
+        attachment_filename=filename,
+    )

+ 36 - 0
gamification.py

@@ -0,0 +1,36 @@
+import time
+import random
+import json
+from pms import random_objects
+
+class HitList:
+
+    @classmethod
+    def deriveUserRanking(cls, user):
+        #
+        # generate ranking for user
+        #
+
+        # waiting delay
+        time.sleep(3)
+
+        rank_categories = [
+            'daily',
+            'weekly',
+            'monthly',
+            'annual',
+        ]
+
+        # generate ranking topics
+        objects = random_objects()
+        rank_topics = random.sample(objects, random.randrange(10)) if objects else [f'Ranking Topic {_+1}' for _ in range(3)]
+
+        # generate and return random ranking
+        return {category: [
+            {
+                'name': f'{category} {topic}'.title(),
+                'operations': random.randrange(10000),
+                'rank': random.randrange(100),
+            } for topic in rank_topics 
+        ] for category in rank_categories}
+

BIN
media/badges/default_bronze.png


BIN
media/badges/default_gold.png


BIN
media/badges/default_silver.png


BIN
media/badges/disabled.png


BIN
media/badges/new.png


BIN
media/badges/type1_bronze.png


BIN
media/badges/type1_gold.png


BIN
media/badges/type1_silver.png


BIN
media/badges/type2_bronze.png


BIN
media/badges/type2_gold.png


BIN
media/badges/type2_silver.png


BIN
media/badges/type3_bronze.png


BIN
media/badges/type3_gold.png


BIN
media/badges/type3_silver.png


BIN
media/badges/type4_bronze.png


BIN
media/badges/type4_gold.png


BIN
media/badges/type4_silver.png


BIN
media/badges/type5_bronze.png


BIN
media/badges/type5_gold.png


BIN
media/badges/type5_silver.png


BIN
media/badges/type6_bronze.png


BIN
media/badges/type6_gold.png


BIN
media/badges/type6_silver.png


BIN
media/badges/type7_bronze.png


BIN
media/badges/type7_gold.png


BIN
media/badges/type7_silver.png


BIN
media/badges/type8_bronze.png


BIN
media/badges/type8_gold.png


BIN
media/badges/type8_silver.png


BIN
media/badges/type9_bronze.png


BIN
media/badges/type9_gold.png


BIN
media/badges/type9_silver.png


+ 44 - 9
populate_db.py

@@ -2,7 +2,9 @@
 # create default user in PoLZy DB
 #
 
-from polzybackend.models import User, Role, Company, UserToCompany, CompanyToCompany
+from polzybackend.models import User, Role, Company, UserToCompany, CompanyToCompany, \
+    GamificationEvent, GamificationBadgeLevel, GamificationBadgeType, GamificationBadge, GamificationBadgeDescription
+from random import sample, choice
 from polzybackend.utils.auth_utils import generate_token
 import uuid
 from datetime import datetime, timedelta
@@ -15,15 +17,37 @@ app = create_app(Config)
 db = SQLAlchemy(app)
 print(db)
 
-# create OAuth provider
-'''
-print('Creating OAuth Provider...')
-provider = OAuthProvider(
-    name='SampleProvider',
-    client_id=str(uuid.uuid4()),
-    secret_key=generate_token(16),
+# Gamification Badges
+print('Creating Gamification Badges...')
+badge_levels = [
+    "Bronze",
+    "Silver",
+    "Gold",
+]
+levels = []
+next_level = None
+for name in reversed(badge_levels):
+    level = GamificationBadgeLevel(name=name, next_level=next_level, is_lowest=(name == 'Bronze'))
+    levels.append(level)
+    next_level = level
+db.session.add_all(levels)
+
+# add many types
+total_badge_number = 20
+types = [
+    GamificationBadgeType(
+        name=f"type{i+1}",
+        title=f"Type {i+1}",
+    ) for i in range(total_badge_number)]
+db.session.add_all(types)
+# type-level descriptions
+db.session.add_all([
+    GamificationBadgeDescription(
+        level=level,
+        type=type,
+        description=f"Requirements to earn {level.name} Badge {type.title}",
+    ) for level in levels for type in types]
 )
-'''
 
 # create roles
 print('Creating roles...')
@@ -111,6 +135,17 @@ db.session.add(company_admin)
 db.session.add(organization_agent)
 db.session.add(organization_clerk)
 
+# add badges
+user_badge_num = 10
+db.session.add_all([
+    GamificationBadge(
+        user=admin,
+        company=company,
+        type_id=_+1,
+        level=choice(levels),
+    ) for _ in sample(range(total_badge_number), user_badge_num)
+])
+
 company = Company(
     name="SportIns",
     displayed_name="Sports Insurance - just do it and be save",