refactor: patches to fix data, profile dashboard, lms mentor mapping page fixes

This commit is contained in:
pateljannat
2021-05-21 21:40:31 +05:30
parent 637c795321
commit 713dcf178a
23 changed files with 314 additions and 386 deletions

View File

@@ -30,4 +30,4 @@ frappe.ready(() => {
$(".msger-input").val("");
}
})
})
})

View File

@@ -1,9 +1,6 @@
import frappe
from . import utils
from community.lms.doctype.lms_batch.lms_batch import get_messages
def get_context(context):
utils.get_common_context(context)
context.members = utils.get_batch_members(context.batch.name)
context.member_count = len(context.members)
context.messages = context.batch.get_messages()

View File

@@ -1,6 +1,5 @@
{% extends "templates/base.html" %}
{% from "www/macros/sidebar.html" import Sidebar %}
{% from "www/macros/profile.html" import Profile %}
{% from "www/macros/common_macro.html" import BatchHearder %}
{% block title %}Members{% endblock %}
@@ -14,27 +13,27 @@
{{ Sidebar(course, batch) }}
<div class="container">
{{ BatchHearder(course.title, member_count)}}
{{ MembersList(members)}}
{{ BatchHearder(course.title, member_count)}}
{{ MembersList(members)}}
</div>
{% endblock %}
{% macro MembersList(members) %}
<div class="mt-5">
{% for member in members %}
<div class="d-flex align-items-center">
<div>
{{ widgets.Avatar(member=member, avatar_class="avatar-medium") }} <a href="/{{member.username}}">{{ member.full_name }}</a>
</div>
<div class="mr-5">
{{member.full_name}}
</div>
{% if member.is_mentor %}
<div class="badge badge-success">Mentor</div>
{% endif %}
</div>
<hr>
{% endfor %}
{% for member in members %}
<div class="d-flex align-items-center">
<div>
{{ widgets.Avatar(member=member, avatar_class="avatar-medium") }}
</div>
<div class="ml-5 mr-5">
<a href="/{{member.username}}">{{ member.full_name }}</a>
</div>
{% if course.is_mentor(member.name) %}
<div class="badge badge-success">Mentor</div>
{% endif %}
</div>
<hr>
{% endfor %}
</div>
{% endmacro %}

View File

@@ -3,6 +3,3 @@ from . import utils
def get_context(context):
utils.get_common_context(context)
context.members = utils.get_batch_members(context.batch.name)
context.member_count = len(context.members)

View File

@@ -19,25 +19,10 @@ def get_common_context(context):
context.course = course
context.batch = batch
context.members = batch.get_mentors() + batch.get_students()
context.member_count = len(context.members)
context.livecode_url = get_livecode_url()
def get_livecode_url():
return frappe.db.get_single_value("LMS Settings", "livecode_url")
def get_batch_members(batch_name):
members = []
memberships = frappe.get_all("LMS Batch Membership", {"batch": batch_name}, ["member", "member_type"])
for membership in memberships:
member = get_member_with_name(membership.member)
if membership.member_type == "Mentor":
member.is_mentor = True
members.append(member)
return members
def get_member_with_name(name):
try:
return frappe.get_doc("Community Member", name)
except frappe.DoesNotExistError:
return

View File

@@ -1,49 +0,0 @@
import frappe
def get_member_with_email():
try:
return frappe.db.get_value("Community Member", {"email": frappe.session.user}, "name")
except frappe.DoesNotExistError:
return
def get_member_with_name(name):
try:
return frappe.get_doc("Community Member", name)
except frappe.DoesNotExistError:
return
def get_batch(code):
try:
print("get_batch", code)
return frappe.db.get_value("LMS Batch", {"name": code}, ["name", "description"], as_dict=True)
except frappe.DoesNotExistError:
print("Error: notfound")
return
def is_member_of_batch(batch_code):
membership = frappe.get_all("LMS Batch Membership", {"batch": batch_code, "member": get_member_with_email()})
if len(membership):
return True
return False
def redirect_if_not_a_member(course,batch_code):
if not is_member_of_batch(batch_code):
frappe.local.flags.redirect_location = "/courses/" + course
raise frappe.Redirect
def get_course(name):
try:
return frappe.get_doc("LMS Course", {"name": name})
except frappe.DoesNotExistError:
return
def get_batch_members(batch):
members = []
memberships = frappe.get_all("LMS Batch Membership", {"batch": batch}, ["member", "member_type"])
for membership in memberships:
member = get_member_with_name(membership.member)
if membership.member_type == "Mentor":
member.is_mentor = True
members.append(member)
return members

View File

@@ -90,12 +90,12 @@
{% block content %}
<section>
<div class="dashboard__parent">
<div>
{{ widgets.Avatar(member=member, avatar_class="avatar-medium") }} <a href="/{{member.username}}">{{ member.full_name }}</a>
<div class="mr-5">
{{ widgets.Avatar(member=member, avatar_class="avatar-xl") }}
</div>
<div class="dashboard__details">
<div class="dashboard__name">
{{member.full_name}}
<a class="anchor_style" href="/{{member.username}}">{{ member.full_name }}</a>
</div>
<div>
<ul class="nav nav-tabs mt-4" id="myTab" role="tablist">
@@ -120,20 +120,18 @@
{% if activity %}
{% for message in activity %}
<div class="dashboard__message border m-5 p-3">
<a class="anchor_style bold" href="/{{message.member.username}}">{{ message.member.full_name }}</a>
<div class="text-muted float-right">
{{ message.course }} ({{message.batch}})
</div>
<div class="d-flex align-items-center w-100">
<div>
{{ widgets.Avatar(member=member, avatar_class="avatar-medium") }} <a href="/{{member.username}}">{{ member.full_name }}</a>
{{ widgets.Avatar(member=message.member, avatar_class="avatar-medium") }}
</div>
<div class="ml-5 mt-5">{{ frappe.utils.md_to_html(message.message) }}</div>
</div>
<div class="d-flex justify-content-between">
<div class="">
{{message.full_name}}
</div>
<div class="text-muted">
<div class="d-flex">
<div class="text-muted float-right">
{{ frappe.utils.pretty_date(message.creation) }}
</div>
</div>

View File

@@ -8,13 +8,13 @@ def get_context(context):
frappe.local.flags.redirect_location = "/login"
raise frappe.Redirect
context.member = frappe.get_doc("User", frappe.session.user)
context.memberships = get_memberships(context.member.name)
context.memberships = get_memberships()
context.courses = get_courses(context.memberships)
context.activity = get_activity(context.memberships)
context.sketches = list(filter(lambda x: x.owner == frappe.session.user, Sketch.get_recent_sketches(owner=context.member.email)))
def get_memberships(member):
return frappe.get_all("LMS Batch Membership", {"member": member}, ["batch", "member_type", "creation"])
def get_memberships():
return frappe.get_all("LMS Batch Membership", {"member": frappe.session.user}, ["batch", "member_type", "creation"])
def get_courses(memberships):
courses = []
@@ -38,4 +38,5 @@ def get_activity(memberships):
messages = frappe.get_all("LMS Message", {"batch": ["in", ",".join(batches)]}, ["message", "author", "creation", "batch"], order_by='creation desc')
for message in messages:
message.course = courses[message.batch]
message.member = frappe.get_doc("User", message.author)
return messages

View File

@@ -0,0 +1,10 @@
{% macro Profile(photo, full_name, abbr, icon) %}
{% if photo %}
<img class="avatar rounded-circle img-fluid mr-5{% if icon == 'large' %} dashboard__profile {% else %} dashboard__profileSmall {% endif %}"
src="{{ photo }}" alt="{{ full_name }}">
{% else %}
<div class="standard-image mr-5 {% if icon == 'large' %} dashboard__abbr {% else %} dashboard__abbrSmall {% endif %}">
{{ abbr }}
</div>
{% endif %}
{% endmacro %}

View File

@@ -4,130 +4,101 @@
<meta name="description" content="{{ 'Community' }}" />
<meta name="keywords" content="An app that supports Communities." />
<style>
section {
padding: 2rem;
color: #000000;
}
section {
padding: 2rem;
color: #000000;
}
svg {
width: 200px;
height: 200px;
}
svg {
width: 200px;
height: 200px;
}
.dashboard__profile {
width: 150px;
height: 155px;
border-radius: 50%;
object-fit: contain;
}
.dashboard__parent {
display: flex;
}
.dashboard__profileSmall {
width: 59px;
height: 57px;
border-radius: 50%;
object-fit: contain;
}
.dashboard__name {
font-weight: normal;
font-style: normal;
font-size: 36px;
line-height: 42px;
}
.dashboard__abbr {
font-size: 50px;
width: 155px;
height: 155px;
border-radius: 50%;
}
.dashboard__details {
padding-top: 2rem;
}
.dashboard__abbrSmall {
font-size: 20px;
width: 59px;
height: 57px;
border-radius: 50%;
}
.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;
}
@media (max-width: 900px) {
.dashboard__parent {
display: flex;
flex-direction: column;
}
.dashboard__name {
font-weight: normal;
font-style: normal;
font-size: 36px;
line-height: 42px;
}
.dashboard__details {
padding-top: 2rem;
}
.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;
}
@media (max-width: 900px) {
.dashboard__parent {
flex-direction: column;
}
}
}
</style>
{% endblock %}
{% block page_content %}
<div class="dashboard__parent">
<div class="dashboard__photo">
{{ widgets.Avatar(member=member, avatar_class="avatar-medium") }} <a href="/{{member.username}}">{{ member.full_name }}</a>
</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="row">
{% if sketches %}
{% for sketch in sketches %}
<div class="col-md-4 col-sm-6">
{{ widgets.SketchTeaser(sketch=sketch) }}
</div>
{% endfor %}
{% endif %}
</div>
{% if not sketches %}
<p class="text-center">{{member.full_name}} has not created any skecth yet.</p>
{% endif %}
</div>
</div>
</div>
</div>
<div class="dashboard__parent">
<div class="dashboard__photo mr-5">
{{ widgets.Avatar(member=member, avatar_class="avatar-xl") }}
</div>
<div class="dashboard__details">
<div class="dashboard__name">
<a class="anchor_style" href="/{{member.username}}">{{ member.full_name }}</a>
</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="row">
{% if sketches %}
{% for sketch in sketches %}
<div class="col-md-4 col-sm-6">
{{ widgets.SketchTeaser(sketch=sketch) }}
</div>
{% endfor %}
{% endif %}
</div>
{% if not sketches %}
<p class="text-center">{{member.full_name}} has not created any skecth yet.</p>
{% endif %}
</div>
</div>
</div>
</div>
</div>
{% endblock %}
<!-- this is a sample default web page template -->

View File

@@ -3,15 +3,9 @@ from community.lms.models import Sketch
def get_context(context):
context.no_cache = 1
context.username = frappe.form_dict["username"]
context.member = get_member(context.username)
if not context.member:
try:
context.member = frappe.get_doc("User", {"username": frappe.form_dict["username"]})
except:
context.template = "www/404.html"
else:
context.sketches = Sketch.get_recent_sketches(owner=context.member.email)
def get_member(username):
try:
return frappe.get_doc("Community Member", {"username":username})
except frappe.DoesNotExistError:
return