feat: basic doctypes for conference and user profile flow for courses

This commit is contained in:
pateljannat
2021-03-02 18:54:37 +05:30
parent 0f539aabcc
commit a4dffca4d7
41 changed files with 868 additions and 67 deletions

View File

@@ -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) {
// }
});

View File

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

View 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 CommunityConference(Document):
pass

View File

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

View File

@@ -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) {
// }
});

View File

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

View 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 CommunityConferenceParticipant(Document):
pass

View File

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

View File

@@ -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) {
// }
});

View File

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

View 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 CommunityConferenceRequest(Document):
pass

View File

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

View File

@@ -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) {
// }
});

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,4 @@
<div>
<a href="{{ doc.route }}">{{ doc.full_name }}</a>
</div>
<!-- this is a sample default list template -->

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,4 @@
<div>
<a href="{{ doc.route }}">{{ doc.title or doc.name }}</a>
</div>
<!-- this is a sample default list template -->

View File

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

View File

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

View 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) {
// }
});

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

View 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

View File

@@ -0,0 +1,3 @@
frappe.ready(function() {
// bind events here
})

View File

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

View File

@@ -0,0 +1,7 @@
from __future__ import unicode_literals
import frappe
def get_context(context):
# do your magic here
pass

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1 @@
<h1>jannat</h1>