]> git.lizzy.rs Git - cheatdb.git/commitdiff
Add topics todo list based on forum parser
authorrubenwardy <rw@rubenwardy.com>
Sat, 2 Jun 2018 17:22:57 +0000 (18:22 +0100)
committerrubenwardy <rw@rubenwardy.com>
Sat, 2 Jun 2018 17:26:17 +0000 (18:26 +0100)
app/models.py
app/tasks/forumtasks.py
app/templates/admin/list.html
app/templates/todo.html [deleted file]
app/templates/todo/list.html [new file with mode: 0644]
app/templates/todo/topics.html [new file with mode: 0644]
app/templates/users/user_profile_page.html
app/views/admin.py
app/views/packages/todo.py
app/views/users.py
migrations/versions/adad68a5e370_.py [new file with mode: 0644]

index ece47a9e159c980a8288a25ec1b332b8541713da..d85a8881f47eaaf1f29c6273b01af7f5b0f5f8a2 100644 (file)
@@ -678,6 +678,25 @@ class EditRequestChange(db.Model):
                else:
                        setattr(package, self.key.name, self.newValue)
 
+
+
+class KrockForumTopic(db.Model):
+       topic_id  = db.Column(db.Integer, primary_key=True, autoincrement=False)
+       author_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
+       author    = db.relationship("User")
+
+       ttype     = db.Column(db.Integer, nullable=False)
+       title     = db.Column(db.String(200), nullable=False)
+       name      = db.Column(db.String(30), nullable=True)
+       link      = db.Column(db.String(50), nullable=True)
+
+       def getType(self):
+               if self.ttype == 1 or self.ttype == 2:
+                       return PackageType.MOD
+               elif self.ttype == 6:
+                       return PackageType.GAME
+
+
 # Setup Flask-User
 db_adapter = SQLAlchemyAdapter(db, User)        # Register the User model
 user_manager = UserManager(db_adapter, app)     # Initialize Flask-User
index df8dbb8f0ef28abbaab9c84028691e7ae9ae3650..a0339b00d9d3681de24a450114f8c14edc4155a4 100644 (file)
@@ -75,3 +75,47 @@ def importUsersFromModList():
        db.session.commit()
        for author in found:
                checkForumAccount.delay(author, None)
+
+
+BANNED_NAMES = ["mod", "game", "old", "outdated", "wip", "api"]
+ALLOWED_TYPES = [1, 2, 6]
+
+@celery.task()
+def importKrocksModList():
+       contents = urllib.request.urlopen("http://krock-works.16mb.com/MTstuff/modList.php").read().decode("utf-8")
+       list = json.loads(contents)
+       username_to_user = {}
+
+       KrockForumTopic.query.delete()
+
+       for x in list:
+               type = int(x["type"])
+               if not type in ALLOWED_TYPES:
+                       continue
+
+               username = x["author"]
+               user = username_to_user.get(username)
+               if user is None:
+                       user = User.query.filter_by(forums_username=username).first()
+                       assert(user is not None)
+                       username_to_user[username] = user
+
+               import re
+               tags = re.findall("\[([a-z0-9_]+)\]", x["title"])
+               name = None
+               for tag in reversed(tags):
+                       if len(tag) < 50 and not tag in BANNED_NAMES and \
+                                       not re.match("^([a-z][0-9]+)$", tag):
+                               name = tag
+                               break
+
+               topic = KrockForumTopic()
+               topic.topic_id  = x["topicId"]
+               topic.author_id = user.id
+               topic.ttype     = type
+               topic.title     = x["title"]
+               topic.name      = name
+               topic.link      = x.get("link")
+               db.session.add(topic)
+
+       db.session.commit()
index ff422bada7ad1f5d7ef8410fff968f17f7df4524..e5049f904c15577d1c1002b28cf02041358fcb61 100644 (file)
@@ -18,6 +18,7 @@
                        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
                        <select name="action">
                                <option value="importusers">Create users from mod list</option>
+                               <option value="importmodlist">Import Krock's mod list</option>
                                <option value="importscreenshots" selected>Import screenshots from VCS</option>
                                <option value="importdepends">Import dependencies from downloads</option>
                                <option value="modprovides">Set provides to mod name</option>
diff --git a/app/templates/todo.html b/app/templates/todo.html
deleted file mode 100644 (file)
index b20f26c..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}
-{{ title }}
-{% endblock %}
-
-{% block content %}
-       {% if canApproveNew %}
-               <h2>Packages Awaiting Approval</h2>
-               <ul>
-                       {% for p in packages %}
-                               <li><a href="{{ p.getDetailsURL() }}">
-                                       {{ p.title }} by {{ p.author.display_name }}
-                               </a></li>
-                       {% else %}
-                               <li><i>No packages need reviewing.</i></ul>
-                       {% endfor %}
-               </ul>
-       {% endif %}
-
-       {% if canApproveScn %}
-               <h2>Screenshots Awaiting Approval</h2>
-               <ul>
-                       {% for s in screenshots %}
-                               <li>
-                                       <a href="{{ s.getEditURL() }}">{{ s.title }}</a>
-                                       on
-                                       <a href="{{ s.package.getDetailsURL() }}">
-                                               {{ s.package.title }} by {{ s.package.author.display_name }}
-                                       </a>
-                               </li>
-                       {% else %}
-                               <li><i>No screenshots need reviewing.</i></ul>
-                       {% endfor %}
-               </ul>
-       {% endif %}
-
-       {% if canApproveRel %}
-               <h2>Releases Awaiting Approval</h2>
-               <ul>
-                       {% for r in releases %}
-                               <li>
-                                       <a href="{{ r.getEditURL() }}">{{ r.title }}</a>
-                                       on
-                                       <a href="{{ r.package.getDetailsURL() }}">
-                                               {{ r.package.title }} by {{ r.package.author.display_name }}
-                                       </a>
-                               </li>
-                       {% else %}
-                               <li><i>No releases need reviewing.</i></ul>
-                       {% endfor %}
-               </ul>
-       {% endif %}
-{% endblock %}
diff --git a/app/templates/todo/list.html b/app/templates/todo/list.html
new file mode 100644 (file)
index 0000000..20e8f4f
--- /dev/null
@@ -0,0 +1,62 @@
+{% extends "base.html" %}
+
+{% block title %}
+{{ title }}
+{% endblock %}
+
+{% block content %}
+       {% if canApproveNew %}
+               <h2>Packages Awaiting Approval</h2>
+               <ul>
+                       {% for p in packages %}
+                               <li><a href="{{ p.getDetailsURL() }}">
+                                       {{ p.title }} by {{ p.author.display_name }}
+                               </a></li>
+                       {% else %}
+                               <li><i>No packages need reviewing.</i></ul>
+                       {% endfor %}
+               </ul>
+       {% endif %}
+
+       {% if canApproveScn %}
+               <h2>Screenshots Awaiting Approval</h2>
+               <ul>
+                       {% for s in screenshots %}
+                               <li>
+                                       <a href="{{ s.getEditURL() }}">{{ s.title }}</a>
+                                       on
+                                       <a href="{{ s.package.getDetailsURL() }}">
+                                               {{ s.package.title }} by {{ s.package.author.display_name }}
+                                       </a>
+                               </li>
+                       {% else %}
+                               <li><i>No screenshots need reviewing.</i></ul>
+                       {% endfor %}
+               </ul>
+       {% endif %}
+
+       {% if canApproveRel %}
+               <h2>Releases Awaiting Approval</h2>
+               <ul>
+                       {% for r in releases %}
+                               <li>
+                                       <a href="{{ r.getEditURL() }}">{{ r.title }}</a>
+                                       on
+                                       <a href="{{ r.package.getDetailsURL() }}">
+                                               {{ r.package.title }} by {{ r.package.author.display_name }}
+                                       </a>
+                               </li>
+                       {% else %}
+                               <li><i>No releases need reviewing.</i></ul>
+                       {% endfor %}
+               </ul>
+       {% endif %}
+
+       <h2>Forum Topics without a Package</h2>
+
+       <p>
+               There are
+               <a href="{{ url_for('todo_topics_page') }}">{{ topics_to_add }} packages</a>
+               to be added to cdb.
+       </p>
+{% endblock %}
diff --git a/app/templates/todo/topics.html b/app/templates/todo/topics.html
new file mode 100644 (file)
index 0000000..77f32c0
--- /dev/null
@@ -0,0 +1,34 @@
+{% extends "base.html" %}
+
+{% block title %}
+Topics to be Added
+{% endblock %}
+
+{% block content %}
+       <h1>Topics to be Added</h1>
+
+       <p>
+               {{ total - (topics | count) }} / {{ total }} packages have been added.
+               {{ topics | count }} remaining.
+       </p>
+
+       <table>
+               <tr>
+                       <th>Id</th>
+                       <th>Title</th>
+                       <th>Author</th>
+                       <th>Name</th>
+                       <th>Link</th>
+               </tr>
+               {% for topic in topics %}
+                       <tr>
+                               <td>{{ topic.topic_id }}</td>
+                               <td>[{{ topic.getType().value }}] <a href="https://forum.minetest.net/viewtopic.php?t={{ topic.topic_id}}">{{ topic.title }}</a></td>
+                               <td><a href="{{ url_for('user_profile_page', username=topic.author.username) }}">{{ topic.author.display_name}}</a></td>
+                               <td>{{ topic.name or ""}}</td>
+                               <td><a href="{{ topic.link }}">{{ topic.link | domain }}</a></td>
+
+                       </tr>
+               {% endfor %}
+       </table>
+{% endblock %}
index 46312566f254b33e8ed15ee3511ac068478f8592..7181fc2c448a6480ea31ecbf08ea41e82031ca48 100644 (file)
 {% from "macros/packagegridtile.html" import render_pkggrid %}
 {{ render_pkggrid(packages, show_author=False) }}
 
+{% if topics_to_add %}
+       <div class="box box_grey">
+               <h2>Topics to Add</h2>
+
+               <table class="box-body">
+                       <tr>
+                               <th>Id</th>
+                               <th>Title</th>
+                               <th>Name</th>
+                               <th>Link</th>
+                       </tr>
+                       {% for topic in topics_to_add %}
+                               <tr>
+                                       <td>{{ topic.topic_id }}</td>
+                                       <td>[{{ topic.getType().value }}] <a href="https://forum.minetest.net/viewtopic.php?t={{ topic.topic_id}}">{{ topic.title }}</a></td>
+                                       <td>{{ topic.name or ""}}</td>
+                                       <td><a href="{{ topic.link }}">{{ topic.link | domain }}</a></td>
+                               </tr>
+                       {% endfor %}
+               </table>
+       </div>
+{% endif %}
+
 {% endblock %}
index fa6639c30c241814d00568444ceb6cabd18a3f31..65d526497f500686f72292269514987c32437cc0 100644 (file)
@@ -21,7 +21,7 @@ from flask.ext import menu
 from app import app
 from app.models import *
 from app.tasks.importtasks import importRepoScreenshot, importAllDependencies
-from app.tasks.forumtasks  import importUsersFromModList
+from app.tasks.forumtasks  import importUsersFromModList, importKrocksModList
 from flask_wtf import FlaskForm
 from wtforms import *
 from app.utils import loginUser, rank_required
@@ -34,6 +34,9 @@ def admin_page():
                if action == "importusers":
                        task = importUsersFromModList.delay()
                        return redirect(url_for("check_task", id=task.id, r=url_for("user_list_page")))
+               elif action == "importmodlist":
+                       task = importKrocksModList.delay()
+                       return redirect(url_for("check_task", id=task.id, r=url_for("todo_topics_page")))
                elif action == "importscreenshots":
                        packages = Package.query \
                                .filter_by(soft_deleted=False) \
index 26356049c9c57af91e3d3dfd9deb892ff1b2525f..9553ef27519ae48e6643e643eae962113231c179 100644 (file)
@@ -40,6 +40,24 @@ def todo_page():
        if canApproveScn:
                screenshots = PackageScreenshot.query.filter_by(approved=False).all()
 
-       return render_template("todo.html", title="Reports and Work Queue",
+
+       topics_to_add = KrockForumTopic.query \
+                       .filter(~ db.exists().where(Package.forums==KrockForumTopic.topic_id)) \
+                       .count()
+
+       return render_template("todo/list.html", title="Reports and Work Queue",
                packages=packages, releases=releases, screenshots=screenshots,
-               canApproveNew=canApproveNew, canApproveRel=canApproveRel, canApproveScn=canApproveScn)
+               canApproveNew=canApproveNew, canApproveRel=canApproveRel, canApproveScn=canApproveScn,
+               topics_to_add=topics_to_add)
+
+
+@app.route("/todo/topics/")
+@login_required
+def todo_topics_page():
+       total = KrockForumTopic.query.count()
+
+       topics = KrockForumTopic.query \
+                       .filter(~ db.exists().where(Package.forums==KrockForumTopic.topic_id)) \
+                       .all()
+
+       return render_template("todo/topics.html", topics=topics, total=total)
index 84e68285986942c2007c5dff0bad9f7459ba2237..86219f9964a7870108a1edeb98914482191d8633 100644 (file)
@@ -50,12 +50,6 @@ def user_profile_page(username):
        if not user:
                abort(404)
 
-       packages = user.packages.filter_by(soft_deleted=False)
-       if not current_user.is_authenticated or (user != current_user and not current_user.canAccessTodoList()):
-               packages = packages.filter_by(approved=True)
-
-       packages = packages.order_by(db.asc(Package.title))
-
        form = None
        if user.checkPerm(current_user, Permission.CHANGE_DNAME) or \
                        user.checkPerm(current_user, Permission.CHANGE_EMAIL) or \
@@ -97,9 +91,21 @@ def user_profile_page(username):
                        # Redirect to home page
                        return redirect(url_for("user_profile_page", username=username))
 
+       packages = user.packages.filter_by(soft_deleted=False)
+       if not current_user.is_authenticated or (user != current_user and not current_user.canAccessTodoList()):
+               packages = packages.filter_by(approved=True)
+       packages = packages.order_by(db.asc(Package.title))
+
+       topics_to_add = None
+       if current_user == user or user.checkPerm(current_user, Permission.CHANGE_AUTHOR):
+               topics_to_add = KrockForumTopic.query \
+                                       .filter_by(author_id=user.id) \
+                                       .filter(~ db.exists().where(Package.forums==KrockForumTopic.topic_id)) \
+                                       .all()
+
        # Process GET or invalid POST
        return render_template("users/user_profile_page.html",
-                       user=user, form=form, packages=packages)
+                       user=user, form=form, packages=packages, topics_to_add=topics_to_add)
 
 class SetPasswordForm(FlaskForm):
        email = StringField("Email (Optional)", [Optional(), Email()])
diff --git a/migrations/versions/adad68a5e370_.py b/migrations/versions/adad68a5e370_.py
new file mode 100644 (file)
index 0000000..9773979
--- /dev/null
@@ -0,0 +1,37 @@
+"""empty message
+
+Revision ID: adad68a5e370
+Revises: d0bec9e5698e
+Create Date: 2018-06-02 18:23:18.123340
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = 'adad68a5e370'
+down_revision = 'd0bec9e5698e'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.create_table('krock_forum_topic',
+    sa.Column('topic_id', sa.Integer(), autoincrement=False, nullable=False),
+    sa.Column('author_id', sa.Integer(), nullable=False),
+    sa.Column('ttype', sa.Integer(), nullable=False),
+    sa.Column('title', sa.String(length=200), nullable=False),
+    sa.Column('name', sa.String(length=30), nullable=True),
+    sa.Column('link', sa.String(length=50), nullable=True),
+    sa.ForeignKeyConstraint(['author_id'], ['user.id'], ),
+    sa.PrimaryKeyConstraint('topic_id')
+    )
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_table('krock_forum_topic')
+    # ### end Alembic commands ###