feat: profile page

This commit is contained in:
pateljannat
2021-04-14 11:19:02 +05:30
parent 88888903ab
commit e8ff9a5a32
9 changed files with 156 additions and 27 deletions

View File

@@ -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
} }

View File

@@ -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

View File

@@ -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>

View File

@@ -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>`;

View File

@@ -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()

View File

@@ -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 }}

View File

@@ -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"])

View File

@@ -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 %}

View File

@@ -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