feat: basic doctypes for conference and user profile flow for courses
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
// Copyright (c) 2021, Frappe and contributors
|
||||||
|
// For license information, please see license.txt
|
||||||
|
|
||||||
|
frappe.ui.form.on('Community Conference', {
|
||||||
|
// refresh: function(frm) {
|
||||||
|
|
||||||
|
// }
|
||||||
|
});
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"actions": [],
|
||||||
|
"creation": "2021-02-25 17:12:51.981534",
|
||||||
|
"doctype": "DocType",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"field_order": [
|
||||||
|
"conference_name",
|
||||||
|
"live_stream_url"
|
||||||
|
],
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"fieldname": "conference_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Conference Name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "live_stream_url",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Live Stream URL"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"index_web_pages_for_search": 1,
|
||||||
|
"links": [],
|
||||||
|
"modified": "2021-02-25 17:12:51.981534",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Community",
|
||||||
|
"name": "Community Conference",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [
|
||||||
|
{
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "System Manager",
|
||||||
|
"share": 1,
|
||||||
|
"write": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"quick_entry": 1,
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 1
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2021, Frappe and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
# import frappe
|
||||||
|
from frappe.model.document import Document
|
||||||
|
|
||||||
|
class CommunityConference(Document):
|
||||||
|
pass
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2021, Frappe and Contributors
|
||||||
|
# See license.txt
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
# import frappe
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
class TestCommunityConference(unittest.TestCase):
|
||||||
|
pass
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// Copyright (c) 2021, Frappe and contributors
|
||||||
|
// For license information, please see license.txt
|
||||||
|
|
||||||
|
frappe.ui.form.on('Community Conference Participant', {
|
||||||
|
// refresh: function(frm) {
|
||||||
|
|
||||||
|
// }
|
||||||
|
});
|
||||||
@@ -0,0 +1,147 @@
|
|||||||
|
{
|
||||||
|
"actions": [],
|
||||||
|
"autoname": "CON-.YYYY.-.###",
|
||||||
|
"creation": "2021-02-25 17:51:23.959033",
|
||||||
|
"doctype": "DocType",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"field_order": [
|
||||||
|
"participant_details",
|
||||||
|
"participant_name",
|
||||||
|
"participant_designation",
|
||||||
|
"column_break_4",
|
||||||
|
"email",
|
||||||
|
"conference_details",
|
||||||
|
"year",
|
||||||
|
"full_conference_tickets",
|
||||||
|
"user_conference_tickets",
|
||||||
|
"paid",
|
||||||
|
"column_break_11",
|
||||||
|
"tshirt_table",
|
||||||
|
"tshirt_size",
|
||||||
|
"currency",
|
||||||
|
"amount",
|
||||||
|
"thank_you_email_sent"
|
||||||
|
],
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"fieldname": "participant_details",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"label": "Participant Details"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "participant_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Participant Name",
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "participant_designation",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"label": "Participant Designation",
|
||||||
|
"options": "\nCxO\nAnalyst\nConsultant\nDeveloper\nSystem Administrator\nOther"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "column_break_4",
|
||||||
|
"fieldtype": "Column Break"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "email",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Email",
|
||||||
|
"options": "Email",
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "conference_details",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"label": "Conference Details"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "year",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"label": "Year",
|
||||||
|
"options": "\n2017\n2018\n2019\n2020\n2021\n2022\n2023\n2024\n2025"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "full_conference_tickets",
|
||||||
|
"fieldtype": "Int",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Full Conference Tickets",
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "user_conference_tickets",
|
||||||
|
"fieldtype": "Int",
|
||||||
|
"label": "User Conference Tickets"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "paid",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"label": "Paid"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "column_break_11",
|
||||||
|
"fieldtype": "Column Break"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "tshirt_table",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "T-Shirt Sizes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "tshirt_size",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"label": "T-Shirt Size",
|
||||||
|
"options": "S\nM\nL\nXL\nXXL\nXXXL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "currency",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Currency",
|
||||||
|
"options": "USD\nINR",
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "amount",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"label": "Amount",
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "thank_you_email_sent",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"label": "Thank You Email Sent"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"index_web_pages_for_search": 1,
|
||||||
|
"links": [],
|
||||||
|
"modified": "2021-02-25 17:51:23.959033",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Community",
|
||||||
|
"name": "Community Conference Participant",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [
|
||||||
|
{
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "System Manager",
|
||||||
|
"share": 1,
|
||||||
|
"write": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"quick_entry": 1,
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 1
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2021, Frappe and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
# import frappe
|
||||||
|
from frappe.model.document import Document
|
||||||
|
|
||||||
|
class CommunityConferenceParticipant(Document):
|
||||||
|
pass
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2021, Frappe and Contributors
|
||||||
|
# See license.txt
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
# import frappe
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
class TestCommunityConferenceParticipant(unittest.TestCase):
|
||||||
|
pass
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// Copyright (c) 2021, Frappe and contributors
|
||||||
|
// For license information, please see license.txt
|
||||||
|
|
||||||
|
frappe.ui.form.on('Community Conference Request', {
|
||||||
|
// refresh: function(frm) {
|
||||||
|
|
||||||
|
// }
|
||||||
|
});
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
{
|
||||||
|
"actions": [],
|
||||||
|
"creation": "2021-02-25 17:19:10.378290",
|
||||||
|
"doctype": "DocType",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"field_order": [
|
||||||
|
"contact_name",
|
||||||
|
"contact_number",
|
||||||
|
"email",
|
||||||
|
"organization_name",
|
||||||
|
"request_type",
|
||||||
|
"message"
|
||||||
|
],
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"fieldname": "contact_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Contact Name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "contact_number",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Contact Number"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "email",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Email"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "organization_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Organization Name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "request_type",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"label": "Request Type",
|
||||||
|
"options": "Sponsorship\nExhibit Program"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "message",
|
||||||
|
"fieldtype": "Text Editor",
|
||||||
|
"label": "Message"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"index_web_pages_for_search": 1,
|
||||||
|
"links": [],
|
||||||
|
"modified": "2021-02-25 17:19:10.378290",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Community",
|
||||||
|
"name": "Community Conference Request",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [
|
||||||
|
{
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "System Manager",
|
||||||
|
"share": 1,
|
||||||
|
"write": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"quick_entry": 1,
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 1
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2021, Frappe and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
# import frappe
|
||||||
|
from frappe.model.document import Document
|
||||||
|
|
||||||
|
class CommunityConferenceRequest(Document):
|
||||||
|
pass
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2021, Frappe and Contributors
|
||||||
|
# See license.txt
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
# import frappe
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
class TestCommunityConferenceRequest(unittest.TestCase):
|
||||||
|
pass
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// Copyright (c) 2021, Frappe and contributors
|
||||||
|
// For license information, please see license.txt
|
||||||
|
|
||||||
|
frappe.ui.form.on('Community Course Member', {
|
||||||
|
// refresh: function(frm) {
|
||||||
|
|
||||||
|
// }
|
||||||
|
});
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
{
|
||||||
|
"actions": [],
|
||||||
|
"autoname": "field:user_name",
|
||||||
|
"creation": "2021-03-02 11:24:49.612530",
|
||||||
|
"doctype": "DocType",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"field_order": [
|
||||||
|
"enabled",
|
||||||
|
"full_name",
|
||||||
|
"user_name",
|
||||||
|
"email",
|
||||||
|
"short_intro",
|
||||||
|
"bio",
|
||||||
|
"photo",
|
||||||
|
"route"
|
||||||
|
],
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"default": "1",
|
||||||
|
"fieldname": "enabled",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"label": "Enabled"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "full_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Full Name",
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "user_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "User Name",
|
||||||
|
"reqd": 1,
|
||||||
|
"unique": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "email",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Email",
|
||||||
|
"options": "Email"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "short_intro",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Short Intro"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "bio",
|
||||||
|
"fieldtype": "Markdown Editor",
|
||||||
|
"label": "Bio"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "photo",
|
||||||
|
"fieldtype": "Attach Image",
|
||||||
|
"label": "Photo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "route",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Route"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"has_web_view": 1,
|
||||||
|
"index_web_pages_for_search": 1,
|
||||||
|
"is_published_field": "enabled",
|
||||||
|
"links": [],
|
||||||
|
"modified": "2021-03-02 17:53:40.252130",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Community",
|
||||||
|
"name": "Community Course Member",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [
|
||||||
|
{
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "System Manager",
|
||||||
|
"share": 1,
|
||||||
|
"write": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"quick_entry": 1,
|
||||||
|
"route": "username",
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 1
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2021, Frappe and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
import re
|
||||||
|
from frappe.website.website_generator import WebsiteGenerator
|
||||||
|
from frappe import _
|
||||||
|
|
||||||
|
class CommunityCourseMember(WebsiteGenerator):
|
||||||
|
def validate(self):
|
||||||
|
self.validate_user_name()
|
||||||
|
if not self.route:
|
||||||
|
self.route = "username/" + self.user_name
|
||||||
|
|
||||||
|
def validate_user_name(self):
|
||||||
|
if len(self.user_name) < 4:
|
||||||
|
frappe.throw(_("Username must be atleast 4 characters long."))
|
||||||
|
if not re.match("^[A-Za-z0-9_]*$", self.user_name):
|
||||||
|
frappe.throw(_("Username can only contain alphabets, numbers, and underscore."))
|
||||||
|
self.user_name = self.user_name.lower()
|
||||||
|
|
||||||
|
def after_insert(self):
|
||||||
|
if frappe.db.exists("User", self.email):
|
||||||
|
user = frappe.get_doc("User", self.email)
|
||||||
|
else:
|
||||||
|
user, update_password_link = self.create_user()
|
||||||
|
self.send_email(update_password_link)
|
||||||
|
|
||||||
|
def send_email(self, update_password_link):
|
||||||
|
|
||||||
|
args = {
|
||||||
|
'update_password_link': update_password_link,
|
||||||
|
'full_name': self.full_name,
|
||||||
|
}
|
||||||
|
|
||||||
|
frappe.sendmail(
|
||||||
|
recipients=self.email,
|
||||||
|
sender="Administrator",
|
||||||
|
subject=_("Set your Password"),
|
||||||
|
template="community_course_membership",
|
||||||
|
reference_doctype=self.doctype,
|
||||||
|
reference_name=self.name,
|
||||||
|
send_priority=0,
|
||||||
|
queue_separately=True,
|
||||||
|
args=args)
|
||||||
|
|
||||||
|
def create_user(self):
|
||||||
|
user = frappe.get_doc({
|
||||||
|
"doctype": "User",
|
||||||
|
"email": self.email,
|
||||||
|
"first_name": self.full_name.split(" ")[0],
|
||||||
|
"full_name": self.full_name,
|
||||||
|
"username": self.user_name,
|
||||||
|
"send_welcome_email": 0,
|
||||||
|
"user_type": 'Website User',
|
||||||
|
"redirect_url": "username/" + self.name
|
||||||
|
})
|
||||||
|
user.save(ignore_permissions=True)
|
||||||
|
update_password_link = user.reset_password()
|
||||||
|
return user, update_password_link
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{% extends "templates/web.html" %}
|
||||||
|
|
||||||
|
{% block page_content %}
|
||||||
|
<div class="py-20 row">
|
||||||
|
<div class="col-sm-2 border border-dark">
|
||||||
|
<img src="{{ photo }}" alt="{{ full_name }}">
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<h1>{{ full_name }}</h1>
|
||||||
|
<p class="lead"> {{ short_intro }} </p>
|
||||||
|
<p class="markdown-style"> {{ frappe.utils.md_to_html(bio) }} </p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
<!-- this is a sample default web page template -->
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<div>
|
||||||
|
<a href="{{ doc.route }}">{{ doc.full_name }}</a>
|
||||||
|
</div>
|
||||||
|
<!-- this is a sample default list template -->
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2021, Frappe and Contributors
|
||||||
|
# See license.txt
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
# import frappe
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
class TestCommunityCourseMember(unittest.TestCase):
|
||||||
|
pass
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"actions": [],
|
"actions": [],
|
||||||
"autoname": "field:full_name",
|
"autoname": "field:user_name",
|
||||||
"creation": "2021-02-12 15:47:23.591567",
|
"creation": "2021-02-12 15:47:23.591567",
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
"editable_grid": 1,
|
"editable_grid": 1,
|
||||||
@@ -11,7 +11,9 @@
|
|||||||
"role",
|
"role",
|
||||||
"photo",
|
"photo",
|
||||||
"short_intro",
|
"short_intro",
|
||||||
"bio"
|
"bio",
|
||||||
|
"user_name",
|
||||||
|
"route"
|
||||||
],
|
],
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
@@ -49,13 +51,24 @@
|
|||||||
{
|
{
|
||||||
"allow_in_quick_entry": 1,
|
"allow_in_quick_entry": 1,
|
||||||
"fieldname": "bio",
|
"fieldname": "bio",
|
||||||
"fieldtype": "HTML Editor",
|
"fieldtype": "Markdown Editor",
|
||||||
"label": "Bio"
|
"label": "Bio"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "user_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "User Name",
|
||||||
|
"unique": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "route",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Route"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2021-02-15 12:16:32.428546",
|
"modified": "2021-03-02 11:24:28.763348",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Community",
|
"module": "Community",
|
||||||
"name": "Community Member",
|
"name": "Community Member",
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
# import frappe
|
# import frappe
|
||||||
from frappe.model.document import Document
|
from frappe.website.website_generator import WebsiteGenerator
|
||||||
|
|
||||||
class CommunityMember(Document):
|
class CommunityMember(WebsiteGenerator):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
{% extends "templates/web.html" %}
|
||||||
|
|
||||||
|
{% block page_content %}
|
||||||
|
<div class="py-20 row">
|
||||||
|
<div class="col-sm-2 border border-dark">
|
||||||
|
<img src="{{ photo }}" alt="{{ full_name }}">
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<h1>{{ full_name }}</h1>
|
||||||
|
<p class="lead"> {{ short_intro }}</p>
|
||||||
|
<div class="mt-4">
|
||||||
|
<div>Role: <strong>{{ role }}</strong></div>
|
||||||
|
</div>
|
||||||
|
<p class="markdown-style">{{ frappe.utils.md_to_html(bio) }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
<!-- this is a sample default web page template -->
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<div>
|
||||||
|
<a href="{{ doc.route }}">{{ doc.title or doc.name }}</a>
|
||||||
|
</div>
|
||||||
|
<!-- this is a sample default list template -->
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"actions": [],
|
"actions": [],
|
||||||
|
"allow_import": 1,
|
||||||
"autoname": "field:project_name",
|
"autoname": "field:project_name",
|
||||||
"creation": "2021-02-12 18:28:33.440328",
|
"creation": "2021-02-12 18:28:33.440328",
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
@@ -85,7 +86,7 @@
|
|||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2021-02-23 11:21:47.948253",
|
"modified": "2021-02-24 15:52:56.588565",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Community",
|
"module": "Community",
|
||||||
"name": "Community Project",
|
"name": "Community Project",
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2021, Frappe and Contributors
|
||||||
|
# See license.txt
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
# import frappe
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
class TestTShirtSizes(unittest.TestCase):
|
||||||
|
pass
|
||||||
8
community/community/doctype/tshirt_sizes/tshirt_sizes.js
Normal file
8
community/community/doctype/tshirt_sizes/tshirt_sizes.js
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
// Copyright (c) 2021, Frappe and contributors
|
||||||
|
// For license information, please see license.txt
|
||||||
|
|
||||||
|
frappe.ui.form.on('TShirt Sizes', {
|
||||||
|
// refresh: function(frm) {
|
||||||
|
|
||||||
|
// }
|
||||||
|
});
|
||||||
49
community/community/doctype/tshirt_sizes/tshirt_sizes.json
Normal file
49
community/community/doctype/tshirt_sizes/tshirt_sizes.json
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"actions": [],
|
||||||
|
"creation": "2021-02-25 17:52:49.813558",
|
||||||
|
"doctype": "DocType",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"field_order": [
|
||||||
|
"size",
|
||||||
|
"quantity"
|
||||||
|
],
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"fieldname": "size",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"label": "Size",
|
||||||
|
"options": "S\nM\nL\nXL\nXXL\nXXXL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "quantity",
|
||||||
|
"fieldtype": "Int",
|
||||||
|
"label": "Quantity"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"index_web_pages_for_search": 1,
|
||||||
|
"links": [],
|
||||||
|
"modified": "2021-02-25 17:52:49.813558",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Community",
|
||||||
|
"name": "TShirt Sizes",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [
|
||||||
|
{
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "System Manager",
|
||||||
|
"share": 1,
|
||||||
|
"write": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"quick_entry": 1,
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 1
|
||||||
|
}
|
||||||
10
community/community/doctype/tshirt_sizes/tshirt_sizes.py
Normal file
10
community/community/doctype/tshirt_sizes/tshirt_sizes.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2021, Frappe and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
# import frappe
|
||||||
|
from frappe.model.document import Document
|
||||||
|
|
||||||
|
class TShirtSizes(Document):
|
||||||
|
pass
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
frappe.ready(function() {
|
||||||
|
// bind events here
|
||||||
|
})
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
{
|
||||||
|
"accept_payment": 0,
|
||||||
|
"allow_comments": 0,
|
||||||
|
"allow_delete": 0,
|
||||||
|
"allow_edit": 0,
|
||||||
|
"allow_incomplete": 0,
|
||||||
|
"allow_multiple": 0,
|
||||||
|
"allow_print": 0,
|
||||||
|
"amount": 0.0,
|
||||||
|
"amount_based_on_field": 0,
|
||||||
|
"apply_document_permissions": 0,
|
||||||
|
"button_label": "Submit",
|
||||||
|
"creation": "2021-03-02 11:31:39.072501",
|
||||||
|
"doc_type": "Community Course Member",
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "Web Form",
|
||||||
|
"idx": 0,
|
||||||
|
"is_standard": 1,
|
||||||
|
"login_required": 0,
|
||||||
|
"max_attachment_size": 0,
|
||||||
|
"modified": "2021-03-02 11:31:39.072501",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Community",
|
||||||
|
"name": "community-course-membership",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"payment_button_label": "Buy Now",
|
||||||
|
"published": 1,
|
||||||
|
"route": "community-course-membership",
|
||||||
|
"route_to_success_link": 0,
|
||||||
|
"show_attachments": 0,
|
||||||
|
"show_in_grid": 0,
|
||||||
|
"show_sidebar": 0,
|
||||||
|
"sidebar_items": [],
|
||||||
|
"success_url": "/community-course-membership",
|
||||||
|
"title": "Community Course Membership",
|
||||||
|
"web_form_fields": [
|
||||||
|
{
|
||||||
|
"allow_read_on_all_link_options": 0,
|
||||||
|
"fieldname": "full_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"label": "Full Name",
|
||||||
|
"max_length": 0,
|
||||||
|
"max_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"show_in_filter": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_read_on_all_link_options": 0,
|
||||||
|
"fieldname": "user_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"label": "User Name",
|
||||||
|
"max_length": 0,
|
||||||
|
"max_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"show_in_filter": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_read_on_all_link_options": 0,
|
||||||
|
"fieldname": "email",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"label": "Email",
|
||||||
|
"max_length": 0,
|
||||||
|
"max_value": 0,
|
||||||
|
"options": "Email",
|
||||||
|
"read_only": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"show_in_filter": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_read_on_all_link_options": 0,
|
||||||
|
"fieldname": "short_intro",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"label": "Short Intro",
|
||||||
|
"max_length": 0,
|
||||||
|
"max_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"show_in_filter": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_read_on_all_link_options": 0,
|
||||||
|
"fieldname": "bio",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"label": "Bio",
|
||||||
|
"max_length": 0,
|
||||||
|
"max_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"show_in_filter": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_read_on_all_link_options": 0,
|
||||||
|
"fieldname": "photo",
|
||||||
|
"fieldtype": "Attach Image",
|
||||||
|
"hidden": 0,
|
||||||
|
"label": "Photo",
|
||||||
|
"max_length": 0,
|
||||||
|
"max_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"show_in_filter": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import frappe
|
||||||
|
|
||||||
|
def get_context(context):
|
||||||
|
# do your magic here
|
||||||
|
pass
|
||||||
18
community/templates/emails/community_course_membership.html
Normal file
18
community/templates/emails/community_course_membership.html
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<h4>{{_("Set your Password")}}</h4>
|
||||||
|
<p>Dear {{ full_name }},</p>
|
||||||
|
<p>{{ _("") }}</p>
|
||||||
|
|
||||||
|
{% if update_password_link %}
|
||||||
|
|
||||||
|
<p>{{_("Please click on the following button to set your new password")}}:</p>
|
||||||
|
<p>
|
||||||
|
<button style="border: 1px solid #15c; padding: 4px; border-radius: 5px; background-color: white;">
|
||||||
|
<a href="{{ update_password_link }}" style="color: #15c; font-size: 12px; text-decoration:none;"
|
||||||
|
target="_blank">{{_("Update Password") }}</a>
|
||||||
|
</button>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<p>{{_("Regards")}},<br>
|
||||||
|
{{ _("Team Community") }}</p><br>
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
{% from "www/hackathons/macros/card.html" import null_card %}
|
{% from "www/hackathons/macros/card.html" import null_card %}
|
||||||
{% block head_include %}
|
{% block head_include %}
|
||||||
<meta name="description" content="{{ 'Hackathon' }}" />
|
<meta name="description" content="{{ 'Hackathon' }}" />
|
||||||
<meta name="keywords" content="An app that supports Communities" />
|
<meta name="keywords" content="An app that supports Communities." />
|
||||||
<style>
|
<style>
|
||||||
div.card-hero-img {
|
div.card-hero-img {
|
||||||
height: 220px;
|
height: 220px;
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import frappe
|
import frappe
|
||||||
|
|
||||||
def get_context(context):
|
def get_context(context):
|
||||||
context.no_cache = 1
|
context.no_cache = 1
|
||||||
context.hackathons = get_hackathons()
|
context.hackathons = get_hackathons()
|
||||||
|
|
||||||
def get_hackathons():
|
def get_hackathons():
|
||||||
return frappe.get_all("Community Hackathon")
|
return frappe.get_all("Community Hackathon")
|
||||||
@@ -3,88 +3,88 @@ import frappe
|
|||||||
from frappe import _
|
from frappe import _
|
||||||
|
|
||||||
def get_context(context):
|
def get_context(context):
|
||||||
context.no_cache = 1
|
context.no_cache = 1
|
||||||
try:
|
try:
|
||||||
project = frappe.form_dict['project']
|
project = frappe.form_dict['project']
|
||||||
hackathon = frappe.form_dict['hackathon']
|
hackathon = frappe.form_dict['hackathon']
|
||||||
except KeyError:
|
except KeyError:
|
||||||
frappe.local.flags.redirect_location = '/hackathons'
|
frappe.local.flags.redirect_location = '/hackathons'
|
||||||
raise frappe.Redirect
|
raise frappe.Redirect
|
||||||
context.project = get_project(project)
|
context.project = get_project(project)
|
||||||
context.hackathon = hackathon
|
context.hackathon = hackathon
|
||||||
context.members = get_members(project)
|
context.members = get_members(project)
|
||||||
context.confirmed_members = get_comfirmed_members(project)
|
context.confirmed_members = get_comfirmed_members(project)
|
||||||
context.updates = get_updates(project)
|
context.updates = get_updates(project)
|
||||||
if frappe.session.user != "Guest":
|
if frappe.session.user != "Guest":
|
||||||
context.my_project = get_my_projects()
|
context.my_project = get_my_projects()
|
||||||
context.is_owner = context.project.owner == frappe.session.user
|
context.is_owner = context.project.owner == frappe.session.user
|
||||||
context.accepted_members = get_accepted_members(project)
|
context.accepted_members = get_accepted_members(project)
|
||||||
context.is_member = check_is_member(project)
|
context.is_member = check_is_member(project)
|
||||||
context.liked = get_liked_project(project)
|
context.liked = get_liked_project(project)
|
||||||
|
|
||||||
def get_project(project_name):
|
def get_project(project_name):
|
||||||
try:
|
try:
|
||||||
return frappe.get_doc('Community Project', project_name)
|
return frappe.get_doc('Community Project', project_name)
|
||||||
except frappe.DoesNotExistError:
|
except frappe.DoesNotExistError:
|
||||||
frappe.throw(_("Project {0} does not exist.").format(project_name))
|
frappe.throw(_("Project {0} does not exist.").format(project_name))
|
||||||
|
|
||||||
def get_members(project_name):
|
def get_members(project_name):
|
||||||
return frappe.get_all("Community Project Member", {"project": project_name, "status": ("!=", "Rejected") }, ['name', "owner", "status", 'intro'])
|
return frappe.get_all("Community Project Member", {"project": project_name, "status": ("!=", "Rejected") }, ['name', "owner", "status", 'intro'])
|
||||||
|
|
||||||
def get_comfirmed_members(project_name):
|
def get_comfirmed_members(project_name):
|
||||||
return frappe.get_all("Community Project Member", {"project": project_name, "status": ("=", "Accepted") }, ['name'])
|
return frappe.get_all("Community Project Member", {"project": project_name, "status": ("=", "Accepted") }, ['name'])
|
||||||
|
|
||||||
def get_updates(project_name):
|
def get_updates(project_name):
|
||||||
return frappe.get_all('Community Project Update', {"project": project_name}, ['owner', 'creation', '`update` as project_update'])
|
return frappe.get_all('Community Project Update', {"project": project_name}, ['owner', 'creation', '`update` as project_update'])
|
||||||
|
|
||||||
def get_accepted_members(project_name):
|
def get_accepted_members(project_name):
|
||||||
return frappe.get_all("Community Project Member", {"project": project_name, "status": "Accepted" })
|
return frappe.get_all("Community Project Member", {"project": project_name, "status": "Accepted" })
|
||||||
|
|
||||||
def get_my_projects():
|
def get_my_projects():
|
||||||
my_project = frappe.db.get_value('Community Project', {"owner": frappe.session.user})
|
my_project = frappe.db.get_value('Community Project', {"owner": frappe.session.user})
|
||||||
if not my_project:
|
if not my_project:
|
||||||
my_project = frappe.db.get_value('Community Project Member', {"owner": frappe.session.user, "status": 'Accepted'}, 'project')
|
my_project = frappe.db.get_value('Community Project Member', {"owner": frappe.session.user, "status": 'Accepted'}, 'project')
|
||||||
return my_project
|
return my_project
|
||||||
|
|
||||||
def check_is_member(project_name):
|
def check_is_member(project_name):
|
||||||
return frappe.get_all("Community Project Member", {"project": project_name, "status": "Accepted", "owner": frappe.session.user })
|
return frappe.get_all("Community Project Member", {"project": project_name, "status": "Accepted", "owner": frappe.session.user })
|
||||||
|
|
||||||
def get_liked_project(project_name):
|
def get_liked_project(project_name):
|
||||||
return frappe.db.get_value("Community Project Like", {"owner": frappe.session.user, "project": project_name})
|
return frappe.db.get_value("Community Project Like", {"owner": frappe.session.user, "project": project_name})
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def join_request(id, action):
|
def join_request(id, action):
|
||||||
if action == 'Accept':
|
if action == 'Accept':
|
||||||
project_member = frappe.get_doc('Community Project Member', id)
|
project_member = frappe.get_doc('Community Project Member', id)
|
||||||
if len(frappe.db.get_all('Community Project Member',
|
if len(frappe.db.get_all('Community Project Member',
|
||||||
dict(project = project_member.project, status = 'Accepted'))) > 2:
|
dict(project = project_member.project, status = 'Accepted'))) > 2:
|
||||||
frappe.throw('A project cannot have more than 4 members')
|
frappe.throw('A project cannot have more than 4 members')
|
||||||
frappe.db.set_value('Community Project Member', id, 'status', 'Accepted')
|
frappe.db.set_value('Community Project Member', id, 'status', 'Accepted')
|
||||||
else:
|
else:
|
||||||
frappe.db.set_value('Community Project Member', id, 'status', 'Rejected')
|
frappe.db.set_value('Community Project Member', id, 'status', 'Rejected')
|
||||||
|
|
||||||
def has_already_liked(project):
|
def has_already_liked(project):
|
||||||
likes = frappe.db.get_value('Community Project Like', {"owner": frappe.session.user, "project": project})
|
likes = frappe.db.get_value('Community Project Like', {"owner": frappe.session.user, "project": project})
|
||||||
return likes
|
return likes
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_project_likes(project):
|
def get_project_likes(project):
|
||||||
return len(frappe.get_all("Community Project Like", {"project": project}))
|
return len(frappe.get_all("Community Project Like", {"project": project}))
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def like(project, initial=False):
|
def like(project, initial=False):
|
||||||
liked_project = has_already_liked(project)
|
liked_project = has_already_liked(project)
|
||||||
action = "Liked" if (liked_project and initial) else "Unliked"
|
action = "Liked" if (liked_project and initial) else "Unliked"
|
||||||
if not initial:
|
if not initial:
|
||||||
if liked_project:
|
if liked_project:
|
||||||
action = "Unliked"
|
action = "Unliked"
|
||||||
frappe.get_doc("Community Project Like", liked_project).delete()
|
frappe.get_doc("Community Project Like", liked_project).delete()
|
||||||
else:
|
else:
|
||||||
action = "Liked"
|
action = "Liked"
|
||||||
frappe.get_doc({"doctype": "Community Project Like","project": project}).save()
|
frappe.get_doc({"doctype": "Community Project Like","project": project}).save()
|
||||||
|
|
||||||
frappe.db.set_value("Community Project", project, "likes", get_project_likes(project))
|
frappe.db.set_value("Community Project", project, "likes", get_project_likes(project))
|
||||||
return {
|
return {
|
||||||
"action": action,
|
"action": action,
|
||||||
"likes": get_project_likes(project)
|
"likes": get_project_likes(project)
|
||||||
}
|
}
|
||||||
|
|||||||
1
community/www/jannat.html
Normal file
1
community/www/jannat.html
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<h1>jannat</h1>
|
||||||
Reference in New Issue
Block a user