feat: profile page
This commit is contained in:
@@ -107,7 +107,7 @@
|
|||||||
"has_web_view": 1,
|
"has_web_view": 1,
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2021-04-12 17:32:36.211603",
|
"modified": "2021-04-14 09:36:27.813085",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Community",
|
"module": "Community",
|
||||||
"name": "Community Member",
|
"name": "Community Member",
|
||||||
@@ -139,7 +139,9 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"quick_entry": 1,
|
"quick_entry": 1,
|
||||||
|
"search_fields": "full_name",
|
||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
|
"title_field": "full_name",
|
||||||
"track_changes": 1
|
"track_changes": 1
|
||||||
}
|
}
|
||||||
@@ -156,7 +156,7 @@ whitelist_rules = [{"from_route": p, "to_route": p[1:]} for p in whitelist]
|
|||||||
|
|
||||||
# regex rule to match all profiles
|
# regex rule to match all profiles
|
||||||
profile_rules = [
|
profile_rules = [
|
||||||
{"from_route": "/<string(minlength=5):username>", "to_route": "profiles/profile"},
|
{"from_route": "/<string(minlength=4):username>", "to_route": "profiles/profile"},
|
||||||
]
|
]
|
||||||
|
|
||||||
website_route_rules = primary_rules + whitelist_rules + profile_rules
|
website_route_rules = primary_rules + whitelist_rules + profile_rules
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
<div class="tab-pane fade py-4 show active" role="tabpanel" id="home">
|
<div class="tab-pane fade py-4 show active" role="tabpanel" id="home">
|
||||||
<div class='container'>
|
<div class='container'>
|
||||||
<div>{{ frappe.utils.md_to_html(course.description) }}</div>
|
<div>{{ frappe.utils.md_to_html(course.description) }}</div>
|
||||||
<div class="list-group">
|
<div class="list-group">
|
||||||
{% for topic in course.topics %}
|
{% for topic in course.topics %}
|
||||||
<div class="list-group-item">
|
<div class="list-group-item">
|
||||||
@@ -80,7 +80,7 @@
|
|||||||
<div class="discussions">
|
<div class="discussions">
|
||||||
{% for message in discussions %}
|
{% for message in discussions %}
|
||||||
<div class="list-group-item">
|
<div class="list-group-item">
|
||||||
<h6>{{ message.author }}</h6>
|
<h6>{{ message.author_name }}</h6>
|
||||||
{{ message.message }}
|
{{ message.message }}
|
||||||
<div class="small text-muted text-right">{{ message.creation }}</div>
|
<div class="small text-muted text-right">{{ message.creation }}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -35,9 +35,9 @@ frappe.ready(() => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
var add_message = (message, session_user = false) => {
|
var add_message = (message, session_user = false) => {
|
||||||
var author = session_user ? "You" : message.author
|
var author_name = session_user ? "You" : message.author_name
|
||||||
return `<div class="list-group-item">
|
return `<div class="list-group-item">
|
||||||
<h6> ${author} </h6>
|
<h6> ${author_name} </h6>
|
||||||
${message.message}
|
${message.message}
|
||||||
<div class="small text-muted text-right"> ${message.creation} </div>
|
<div class="small text-muted text-right"> ${message.creation} </div>
|
||||||
</div>`;
|
</div>`;
|
||||||
|
|||||||
@@ -57,9 +57,9 @@ def get_messages(batch):
|
|||||||
for message in messages:
|
for message in messages:
|
||||||
message.message = frappe.utils.md_to_html(message.message)
|
message.message = frappe.utils.md_to_html(message.message)
|
||||||
message.creation = frappe.utils.format_datetime(message.creation, "medium")
|
message.creation = frappe.utils.format_datetime(message.creation, "medium")
|
||||||
member_email = frappe.db.get_value("Community Member", message.author, "email")
|
message.author_name, member_email = frappe.db.get_value("Community Member", message.author, ["full_name","email"])
|
||||||
if member_email == frappe.session.user:
|
if member_email == frappe.session.user:
|
||||||
message.author = "You"
|
message.author_name = "You"
|
||||||
return messages
|
return messages
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
|
|||||||
@@ -145,7 +145,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="tab-pane fade py-4" role="tabpanel" id="sketches">
|
<div class="tab-pane fade py-4" role="tabpanel" id="sketches">
|
||||||
<div class='container'>
|
<div class="container">
|
||||||
<a href="/sketches/new">Create a New Sketch</a>
|
<a href="/sketches/new">Create a New Sketch</a>
|
||||||
<div class="row row-cols-1 row-cols-xl-5 row-cols-lg-4 row-cols-md-3 row-cols-sm-2">
|
<div class="row row-cols-1 row-cols-xl-5 row-cols-lg-4 row-cols-md-3 row-cols-sm-2">
|
||||||
{% if sketches %}
|
{% if sketches %}
|
||||||
@@ -181,7 +181,9 @@
|
|||||||
{% for course in courses %}
|
{% for course in courses %}
|
||||||
<div class="dashboard__course">
|
<div class="dashboard__course">
|
||||||
<div class="dashboard__courseHeader">
|
<div class="dashboard__courseHeader">
|
||||||
<h5 class="w-75">{{ course.name }}</h5>
|
<a class="text-decoration-none" target="_blank" href="/courses/{{course.slug}}">
|
||||||
|
<h5 class="w-75">{{ course.name }}</h5>
|
||||||
|
</a>
|
||||||
{% if course.member_type %}
|
{% if course.member_type %}
|
||||||
<div class="dashboard__badge">
|
<div class="dashboard__badge">
|
||||||
{{ course.member_type }}
|
{{ course.member_type }}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ def get_context(context):
|
|||||||
context.courses = get_courses(context.memberships)
|
context.courses = get_courses(context.memberships)
|
||||||
context.activity = get_activity(context.memberships)
|
context.activity = get_activity(context.memberships)
|
||||||
context.sketches = list(filter(lambda x: x.owner == frappe.session.user, get_recent_sketches()))
|
context.sketches = list(filter(lambda x: x.owner == frappe.session.user, get_recent_sketches()))
|
||||||
print(context)
|
|
||||||
def get_memberships(member):
|
def get_memberships(member):
|
||||||
return frappe.get_all("LMS Batch Membership", {"member": member}, ["batch", "member_type", "creation"])
|
return frappe.get_all("LMS Batch Membership", {"member": member}, ["batch", "member_type", "creation"])
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,143 @@
|
|||||||
{% extends "templates/web.html" %}
|
{% extends "templates/web.html" %}
|
||||||
{% from "www/macros/profile.html" import profile %}
|
{% from "www/macros/profile.html" import profile %}
|
||||||
|
{% block head_include %}
|
||||||
|
<meta name="description" content="{{ 'Community' }}" />
|
||||||
|
<meta name="keywords" content="An app that supports Communities." />
|
||||||
|
<style>
|
||||||
|
section {
|
||||||
|
padding: 2rem;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
svg {
|
||||||
|
width: 200px;
|
||||||
|
height: 200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard__profile {
|
||||||
|
width: 150px;
|
||||||
|
height: 155px;
|
||||||
|
border-radius: 50%;
|
||||||
|
object-fit: contain;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard__profileSmall {
|
||||||
|
width: 59px;
|
||||||
|
height: 57px;
|
||||||
|
border-radius: 50%;
|
||||||
|
object-fit: contain;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard__abbr {
|
||||||
|
font-size: 50px;
|
||||||
|
width: 155px;
|
||||||
|
height: 155px;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard__abbrSmall {
|
||||||
|
font-size: 20px;
|
||||||
|
width: 59px;
|
||||||
|
height: 57px;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard__parent {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard__name {
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
font-size: 36px;
|
||||||
|
line-height: 42px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard__details {
|
||||||
|
padding-top: 2rem;
|
||||||
|
width: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard__course {
|
||||||
|
border: 1px solid black;
|
||||||
|
padding: 1rem;
|
||||||
|
margin: 0.5rem;
|
||||||
|
width: 48%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard__courseHeader {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
height: 50px;
|
||||||
|
margin-bottom: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard__badge {
|
||||||
|
background: #D6D6FF;
|
||||||
|
border-radius: 20px;
|
||||||
|
color: #1712FE;
|
||||||
|
padding: 0.5rem;
|
||||||
|
height: fit-content;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard__description {
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
{% endblock %}
|
||||||
{% block page_content %}
|
{% block page_content %}
|
||||||
<section>
|
<section>
|
||||||
<div>
|
<div class="dashboard__parent">
|
||||||
{{ profile(member.photo, member.full_name, abbr, "large")}}
|
<div>
|
||||||
|
{{ profile(member.photo, member.full_name, abbr, "large")}}
|
||||||
|
</div>
|
||||||
|
<div class="dashboard__details">
|
||||||
|
<div class="dashboard__name">
|
||||||
|
{{member.full_name}}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<ul class="nav nav-tabs mt-4" id="myTab" role="tablist">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link active" id="home-tab" data-toggle="tab" href="#home" role="tab"
|
||||||
|
aria-controls="home" aria-selected="true">Sketches</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div class="tab-content">
|
||||||
|
<div class="tab-pane fade py-4 show active" role="tabpanel" id="home">
|
||||||
|
<div class='container'>
|
||||||
|
<a href="/sketches/new">Create a New Sketch</a>
|
||||||
|
<div class="row row-cols-1 row-cols-xl-5 row-cols-lg-4 row-cols-md-3 row-cols-sm-2">
|
||||||
|
{% if sketches %}
|
||||||
|
{% for sketch in sketches %}
|
||||||
|
<div class="col m-4">
|
||||||
|
<div class="card sketch-card" style="width: 200px;">
|
||||||
|
<div class="card-img-top">
|
||||||
|
<a href="/sketches/{{sketch.sketch_id}}">
|
||||||
|
{{ sketch.to_svg() }}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="card-footer">
|
||||||
|
<div class="sketch-title">
|
||||||
|
<a href="sketches/{{sketch.sketch_id}}">{{sketch.title}}</a>
|
||||||
|
</div>
|
||||||
|
<div class="sketch-author">
|
||||||
|
by {{sketch.get_owner_name()}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<p class="text-center">You have not created any sketches.</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -1,18 +1,9 @@
|
|||||||
import frappe
|
import frappe
|
||||||
|
from ...lms.doctype.lms_sketch.lms_sketch import get_recent_sketches
|
||||||
|
|
||||||
def get_context(context):
|
def get_context(context):
|
||||||
context.no_cache = 1
|
context.no_cache = 1
|
||||||
|
context.username = frappe.form_dict['username']
|
||||||
username = frappe.form_dict.get('username')
|
context.member = frappe.get_doc("Community Member", {"username":context.username})
|
||||||
user = username and get_user(username)
|
context.abbr = "".join([s[0] for s in context.member.full_name.split()])
|
||||||
if not user:
|
context.sketches = list(filter(lambda x: x.owner == context.member.email, get_recent_sketches()))
|
||||||
context.template = "www/404.html"
|
|
||||||
|
|
||||||
user.abbr = "".join([s[0] for s in user.full_name.split()])
|
|
||||||
context.user = user
|
|
||||||
|
|
||||||
def get_user(username):
|
|
||||||
try:
|
|
||||||
return frappe.get_doc("Community Member", username)
|
|
||||||
except frappe.DoesNotExistError:
|
|
||||||
return
|
|
||||||
|
|||||||
Reference in New Issue
Block a user