diff --git a/app/models.py b/app/models.py index 3a41c83..d3cba53 100644 --- a/app/models.py +++ b/app/models.py @@ -19,7 +19,7 @@ from flask import Flask, url_for from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from urllib.parse import urlparse -from app import app +from app import app, gravatar from datetime import datetime from sqlalchemy.orm import validates from flask_user import login_required, UserManager, UserMixin, SQLAlchemyAdapter @@ -97,26 +97,27 @@ class Permission(enum.Enum): raise Exception("Non-global permission checked globally. Use Package.checkPerm or User.checkPerm instead.") class User(db.Model, UserMixin): - id = db.Column(db.Integer, primary_key=True) + id = db.Column(db.Integer, primary_key=True) # User authentication information - username = db.Column(db.String(50, collation="NOCASE"), nullable=False, unique=True, index=True) - password = db.Column(db.String(255), nullable=True) + username = db.Column(db.String(50, collation="NOCASE"), nullable=False, unique=True, index=True) + password = db.Column(db.String(255), nullable=True) reset_password_token = db.Column(db.String(100), nullable=False, server_default="") - rank = db.Column(db.Enum(UserRank)) + rank = db.Column(db.Enum(UserRank)) # Account linking github_username = db.Column(db.String(50, collation="NOCASE"), nullable=True, unique=True) forums_username = db.Column(db.String(50, collation="NOCASE"), nullable=True, unique=True) # User email information - email = db.Column(db.String(255), nullable=True, unique=True) - confirmed_at = db.Column(db.DateTime()) + email = db.Column(db.String(255), nullable=True, unique=True) + confirmed_at = db.Column(db.DateTime()) # User information - active = db.Column("is_active", db.Boolean, nullable=False, server_default="0") - display_name = db.Column(db.String(100), nullable=False, server_default="") + profile_pic = db.Column(db.String(255), nullable=True, server_default=None) + active = db.Column("is_active", db.Boolean, nullable=False, server_default="0") + display_name = db.Column(db.String(100), nullable=False, server_default="") # Content notifications = db.relationship("Notification", primaryjoin="User.id==Notification.user_id") @@ -146,6 +147,12 @@ class User(db.Model, UserMixin): def isClaimed(self): return self.rank.atLeast(UserRank.NEW_MEMBER) + def getProfilePicURL(self): + if self.profile_pic: + return self.profile_pic + else: + return gravatar(self.email or "") + def checkPerm(self, user, perm): if not user.is_authenticated: return False diff --git a/app/tasks/forumtasks.py b/app/tasks/forumtasks.py index 1df6d2b..0a5f028 100644 --- a/app/tasks/forumtasks.py +++ b/app/tasks/forumtasks.py @@ -25,7 +25,7 @@ import urllib.request from urllib.parse import urlparse, quote_plus @celery.task() -def checkForumAccount(username, token=None): +def checkForumAccount(username): try: profile = getProfile("https://forum.minetest.net", username) except OSError: @@ -47,6 +47,10 @@ def checkForumAccount(username, token=None): user.github_username = github_username needsSaving = True + pic = profile.avatar + needsSaving = needsSaving or pic != user.profile_pic + user.profile_pic = pic + # Save if needsSaving: db.session.commit() diff --git a/app/tasks/phpbbparser.py b/app/tasks/phpbbparser.py index 9984ad0..d3e1231 100644 --- a/app/tasks/phpbbparser.py +++ b/app/tasks/phpbbparser.py @@ -15,8 +15,9 @@ def urlEncodeNonAscii(b): class Profile: def __init__(self, username): - self.username = username - self.signature = "" + self.username = username + self.signature = "" + self.avatar = None self.properties = {} def set(self, key, value): @@ -33,6 +34,11 @@ def __extract_properties(profile, soup): if el is None: return None + res1 = el.find_all("dl") + imgs = res1[0].find_all("img") + if len(imgs) == 1: + profile.avatar = imgs[0]["src"] + res = el.find_all("dl", class_ = "left-box details") if len(res) != 1: return None diff --git a/app/templates/users/user_profile_page.html b/app/templates/users/user_profile_page.html index 46881fd..26988ba 100644 --- a/app/templates/users/user_profile_page.html +++ b/app/templates/users/user_profile_page.html @@ -21,11 +21,13 @@
- Please add an email to your profile. -
+ + Gravatar + {% endif %}