Parcourir la source

basic member blogs

still trying to figure out how to maximize customisability (html & css) of member pages as much as how we have them on neocities
cube il y a 4 jours
Parent
révision
7c6aabb1aa

+ 7
- 9
README.md Voir le fichier

24
 - create `config.py` in the instance folder and customise the following settings to your needs
24
 - create `config.py` in the instance folder and customise the following settings to your needs
25
 
25
 
26
 ```
26
 ```
27
-REGISTRATION = True
28
-ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
29
-ICON_UPLOAD_FOLDER = 'myriad/static/icons'
30
-BLINKIES_UPLOAD_FOLDER = 'myriad/static/blinkies'
31
-STAMPS_UPLOAD_FOLDER = 'myriad/static/stamps'
27
+REGISTRATION = True # Make sure to disable in production
28
+ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'} # Can be anything you want
29
+ICON_UPLOAD_FOLDER = 'myriad/static/icons' # where member icons will be stored
30
+BLINKIES_UPLOAD_FOLDER = 'myriad/static/blinkies' # where site assets "blinkies" will be stored
31
+STAMPS_UPLOAD_FOLDER = 'myriad/static/stamps' # where site assets "stamps" will be stored
32
+INLINE_UPLOAD_FOLDER = 'myriad/static/inline' # where site assets "misc inline" will be stored
33
+MISC_UPLOAD_FOLDER = 'myriad/static/misc' # where other small images will be stored
32
 ```
34
 ```
33
 
35
 
34
-- registration should only be set to True in a development situation (in production set it to False one you have set up your administration account). this would mean that anyone can make an account and edit your system
35
-- feel free to adjust allowed file extensions however you choose
36
-- upload folders don't need to be changed
37
-
38
 # usage
36
 # usage
39
 
37
 
40
 - the software here is free to use, and there's no requirement to link back
38
 - the software here is free to use, and there's no requirement to link back

+ 3
- 0
myriad/__init__.py Voir le fichier

30
     from . import manage
30
     from . import manage
31
     app.register_blueprint(manage.bp)
31
     app.register_blueprint(manage.bp)
32
 
32
 
33
+    from . import blog
34
+    app.register_blueprint(blog.bp)
35
+
33
     return app
36
     return app

+ 41
- 0
myriad/blog.py Voir le fichier

1
+from flask import (
2
+    Blueprint, flash, g, redirect, render_template, request, session, url_for, current_app
3
+)
4
+from werkzeug.utils import secure_filename
5
+import os, uuid
6
+
7
+from myriad.auth import login_required
8
+from myriad.db import get_db
9
+
10
+bp = Blueprint('blog', __name__, url_prefix='/blog')
11
+
12
+@bp.route('/')
13
+def blog():
14
+    db = get_db()
15
+    posts = db.execute("SELECT * FROM blog ORDER BY created DESC").fetchall()
16
+    members = db.execute("SELECT id,member_name FROM member").fetchall()
17
+    member_ids={}
18
+    for member in members:
19
+        member_ids[member[0]] = member[1]
20
+
21
+    return render_template('blog/blog.html', blog=posts, member_ids=member_ids)
22
+
23
+@bp.route('/new', methods=('GET', 'POST'))
24
+@login_required
25
+def new():
26
+    db = get_db()
27
+    members = db.execute("SELECT id,member_name FROM member").fetchall()
28
+
29
+    if request.method == 'POST':
30
+        title = request.form['title']
31
+        content = request.form['content']
32
+        mid = request.form["mid"]
33
+
34
+        db.execute("INSERT INTO blog (member_id, title, content) VALUES (?, ?, ?)",(mid, title, content))
35
+        db.commit()
36
+
37
+        return redirect(url_for('blog.blog'))
38
+        
39
+    
40
+    return render_template('blog/new.html', members=members)
41
+

+ 9
- 1
myriad/home.py Voir le fichier

41
             else:
41
             else:
42
                 icons[member[0]] = None
42
                 icons[member[0]] = None
43
 
43
 
44
-    return render_template('full.html', memberlist=members, icons=icons)
44
+    return render_template('full.html', memberlist=members, icons=icons)
45
+
46
+@bp.route('/member/<mid>')
47
+def page(mid):
48
+    db = get_db()
49
+    member = db.execute("SELECT * FROM member WHERE id=(?)",(mid,)).fetchone()
50
+    blog = db.execute("SELECT * FROM blog WHERE member_id=(?) ORDER BY created DESC",(mid,)).fetchall()
51
+
52
+    return render_template('page.html', member=member, blog=blog)

+ 5
- 3
myriad/schema.sql Voir le fichier

3
 DROP TABLE IF EXISTS icons;
3
 DROP TABLE IF EXISTS icons;
4
 DROP TABLE IF EXISTS groups;
4
 DROP TABLE IF EXISTS groups;
5
 DROP TABLE IF EXISTS group_members;
5
 DROP TABLE IF EXISTS group_members;
6
-DROP TABLE IF EXISTS pages;
6
+DROP TABLE IF EXISTS blog;
7
 
7
 
8
 CREATE TABLE user (
8
 CREATE TABLE user (
9
   id INTEGER PRIMARY KEY AUTOINCREMENT,
9
   id INTEGER PRIMARY KEY AUTOINCREMENT,
60
   FOREIGN KEY (member_id) REFERENCES member (id)
60
   FOREIGN KEY (member_id) REFERENCES member (id)
61
 );
61
 );
62
 
62
 
63
-CREATE TABLE pages (
63
+CREATE TABLE blog (
64
   id INTEGER PRIMARY KEY AUTOINCREMENT,
64
   id INTEGER PRIMARY KEY AUTOINCREMENT,
65
   member_id INTEGER NOT NULL,
65
   member_id INTEGER NOT NULL,
66
-  page_location TEXT NOT NULL,
66
+  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
67
+  title TEXT,
68
+  content TEXT,
67
   FOREIGN KEY (member_id) REFERENCES member (id)
69
   FOREIGN KEY (member_id) REFERENCES member (id)
68
 );
70
 );

+ 5
- 0
myriad/templates/base.html Voir le fichier

14
     {% if g.user %}
14
     {% if g.user %}
15
     <div class="heading">Manage</div>
15
     <div class="heading">Manage</div>
16
     <div class="navitem">> <a href="{{ url_for('manage.new') }}">Add New Member</a></div>
16
     <div class="navitem">> <a href="{{ url_for('manage.new') }}">Add New Member</a></div>
17
+    <div class="navitem">> <a href="">Site Assets</a></div>
17
     {% endif %}
18
     {% endif %}
18
 
19
 
20
+    <div class="heading">Blog</div>
21
+    {% if g.user %}<div class="navitem">> <a href="{{ url_for('blog.new') }}">New Post</a></div>{% endif %}
22
+    <div class="navitem">> <a href="{{ url_for('blog.blog') }}">View All Posts</a></div>
23
+
19
     <div class="heading">Administration</div>
24
     <div class="heading">Administration</div>
20
     {% if g.user %}
25
     {% if g.user %}
21
       <div class="navitem">> <a href="{{ url_for('auth.logout') }}">Log out</a></div>
26
       <div class="navitem">> <a href="{{ url_for('auth.logout') }}">Log out</a></div>

+ 19
- 0
myriad/templates/blog/blog.html Voir le fichier

1
+{% extends 'base.html' %}
2
+
3
+{% block header %}
4
+  <div class="title">{% block title %}System Blog{% endblock %}</div>
5
+{% endblock %}
6
+
7
+{% block content %}
8
+  
9
+  {% for post in blog %}
10
+    <div class="post">
11
+        <div class="title">{{post[3]}}</div>
12
+        <div class="timestamp">{{post[2]}} - <a href="{{ url_for('home.page', mid=post[1]) }}">{{member_ids[post[1]]}}</a></div>
13
+        <div class="content">
14
+            {{post[4]}}
15
+        </div>
16
+    </div>
17
+  {% endfor %}
18
+
19
+{% endblock %}

+ 24
- 0
myriad/templates/blog/new.html Voir le fichier

1
+{% extends 'base.html' %}
2
+
3
+{% block header %}
4
+  <div class="title">{% block title %}New Blog Post{% endblock %}</div>
5
+{% endblock %}
6
+
7
+{% block content %}
8
+  <form method="post">
9
+    <label for="title">Title</label>
10
+    <input name="title" id="title"><br>
11
+    <label for="content">Content</label>
12
+    <textarea name="content" id="content"></textarea><br>
13
+    <label for="mid">Choose a member:</label>
14
+    <select name="mid" id="mid">
15
+      {% for member in members %}
16
+      <option value="{{member[0]}}">{{member[1]}}</option>
17
+      {% endfor %}
18
+    </select> 
19
+    <input type="submit" value="Submit">
20
+  </form>
21
+
22
+  {{ error }}
23
+
24
+{% endblock %}

+ 1
- 1
myriad/templates/full.html Voir le fichier

63
             {{ member[5]|safe }} 
63
             {{ member[5]|safe }} 
64
         </div>
64
         </div>
65
         <br class="clear" />
65
         <br class="clear" />
66
-        {% if g.user %}<div class="heading links">{% if member[8]==0 %}<a href="{{ url_for('manage.add_to_front', mid=member[0]) }}">Add to Front</a>{% else %}<a href="{{ url_for('manage.remove_front', mid=member[0]) }}">Remove from Front</a>{% endif %} &#9734 <a href="{{ url_for('manage.edit', mid=member[0]) }}">Edit</a> &#9734 {% if member[7]==0 %}<a href="{{ url_for('manage.add_to_home', mid=member[0]) }}">Pin to Homepage</a>{% else %}<a href="{{ url_for('manage.remove_home', mid=member[0]) }}">Unpin from Homepage</a>{% endif %}</div>{% endif %}
66
+        <div class="heading links"><a href="{{ url_for('home.page', mid=member[0]) }}">View Page</a>{% if g.user %} &#9734 {% if member[8]==0 %}<a href="{{ url_for('manage.add_to_front', mid=member[0]) }}">Add to Front</a>{% else %}<a href="{{ url_for('manage.remove_front', mid=member[0]) }}">Remove from Front</a>{% endif %} &#9734 <a href="{{ url_for('manage.edit', mid=member[0]) }}">Edit</a> &#9734 {% if member[7]==0 %}<a href="{{ url_for('manage.add_to_home', mid=member[0]) }}">Pin to Homepage</a>{% else %}<a href="{{ url_for('manage.remove_home', mid=member[0]) }}">Unpin from Homepage</a>{% endif %}{% endif %}</div>
67
         <!-- <img src="/geo/dsgame.webp" class="dsgame"> -->
67
         <!-- <img src="/geo/dsgame.webp" class="dsgame"> -->
68
         <br class="clear" />
68
         <br class="clear" />
69
     </div>
69
     </div>

+ 5
- 2
myriad/templates/index.html Voir le fichier

2
 {% block title %}Welcome{% endblock %}
2
 {% block title %}Welcome{% endblock %}
3
 
3
 
4
 {% block content %}
4
 {% block content %}
5
+
6
+  {% if front_list|length > 0 %}
5
   <div id="frontbanner" class="heading">
7
   <div id="frontbanner" class="heading">
6
-    <b>currently fronting: </b> {% for member in front_list %} {{ member[3] }} {% if front_list.index(member) != front_list|length -1 %}&{% endif %} {% endfor %}
8
+    <b>currently fronting: </b> {% for member in front_list %} <a href="{{ url_for('home.page', mid=member[0]) }}">{{ member[3] }}</a> {% if front_list.index(member) != front_list|length -1 %}&{% endif %} {% endfor %}
7
   </div>
9
   </div>
10
+  {% endif %}
8
 
11
 
9
   {% for member in home_pins %}
12
   {% for member in home_pins %}
10
 
13
 
57
             {{ member[5]|safe }} 
60
             {{ member[5]|safe }} 
58
         </div>
61
         </div>
59
         <br class="clear" />
62
         <br class="clear" />
60
-        {% if g.user %}<div class="heading links">{% if member[8]==0 %}<a href="{{ url_for('manage.add_to_front', mid=member[0]) }}">Add to Front</a>{% else %}<a href="{{ url_for('manage.remove_front', mid=member[0]) }}">Remove from Front</a>{% endif %} &#9734 <a href="{{ url_for('manage.edit', mid=member[0]) }}">Edit</a> &#9734 {% if member[7]==0 %}<a href="{{ url_for('manage.add_to_home', mid=member[0]) }}">Pin to Homepage</a>{% else %}<a href="{{ url_for('manage.remove_home', mid=member[0]) }}">Unpin from Homepage</a>{% endif %}</div>{% endif %}
63
+        <div class="heading links"><a href="{{ url_for('home.page', mid=member[0]) }}">View Page</a>{% if g.user %} &#9734 {% if member[8]==0 %}<a href="{{ url_for('manage.add_to_front', mid=member[0]) }}">Add to Front</a>{% else %}<a href="{{ url_for('manage.remove_front', mid=member[0]) }}">Remove from Front</a>{% endif %} &#9734 <a href="{{ url_for('manage.edit', mid=member[0]) }}">Edit</a> &#9734 {% if member[7]==0 %}<a href="{{ url_for('manage.add_to_home', mid=member[0]) }}">Pin to Homepage</a>{% else %}<a href="{{ url_for('manage.remove_home', mid=member[0]) }}">Unpin from Homepage</a>{% endif %}{% endif %}</div>
61
         <!-- <img src="/geo/dsgame.webp" class="dsgame"> -->
64
         <!-- <img src="/geo/dsgame.webp" class="dsgame"> -->
62
         <br class="clear" />
65
         <br class="clear" />
63
     </div>
66
     </div>

+ 21
- 0
myriad/templates/page.html Voir le fichier

1
+{% extends 'base.html' %}
2
+{% block title %}{{ member[3] }}{% endblock %}
3
+
4
+{% block content %}
5
+
6
+    <div class="heading big">{{member[3]}}'s blog</div>
7
+        <div id="blog">
8
+
9
+            {% for post in blog %}
10
+            <div class="post">
11
+                <div class="title">{{post[3]}}</div>
12
+                <div class="timestamp">{{post[2]}}</div>
13
+                <div class="content">
14
+                    {{post[4]}}
15
+                </div>
16
+            </div>
17
+            {% endfor %}
18
+
19
+        </div>
20
+
21
+{% endblock %}