Cleanup of Website Group after nested URLs
This commit is contained in:
parent
a91806fa02
commit
586674cb0b
28 changed files with 446 additions and 685 deletions
|
|
@ -385,12 +385,8 @@ def facebook_login(data):
|
|||
"new_password": webnotes.generate_hash(data["email"]),
|
||||
"fb_username": data["username"],
|
||||
"fb_userid": data["id"],
|
||||
"fb_location": data.get("location", {}).get("name"),
|
||||
"fb_hometown": data.get("hometown", {}).get("name"),
|
||||
"fb_age_range": data.get("age_range") and "{min}-{max}".format(**data.get("age_range")),
|
||||
"location": data.get("location", {}).get("name"),
|
||||
"birth_date": data.get("birthday"),
|
||||
"fb_bio": data.get("bio"),
|
||||
"fb_education": data.get("education") and data.get("education")[-1].get("type"),
|
||||
"user_type": "Website User"
|
||||
})
|
||||
profile.ignore_permissions = True
|
||||
|
|
|
|||
|
|
@ -20,10 +20,6 @@ web_include_css = style_settings.css
|
|||
|
||||
website_clear_cache = webnotes.templates.generators.website_group.clear_cache
|
||||
|
||||
website_group_handler:Forum = webnotes.templates.website_group.forum
|
||||
website_group_handler:Events = webnotes.templates.website_group.events
|
||||
website_group_handler:Tasks = webnotes.templates.website_group.tasks
|
||||
|
||||
get_desktop_icons = webnotes.manage.get_desktop_icons
|
||||
notification_config = webnotes.core.notifications.get_notification_config
|
||||
|
||||
|
|
@ -42,3 +38,8 @@ has_permission:Event = webnotes.core.doctype.event.event.has_permission
|
|||
|
||||
permission_query_conditions:ToDo = webnotes.core.doctype.todo.todo.get_permission_query_conditions
|
||||
has_permission:ToDo = webnotes.core.doctype.todo.todo.has_permission
|
||||
|
||||
# bean
|
||||
|
||||
bean_event:User Vote:after_insert = webnotes.templates.generators.website_group.clear_cache_on_bean_event
|
||||
bean_event:Website Sitemap Permission:on_update = webnotes.templates.generators.website_group.clear_cache_on_bean_event
|
||||
|
|
@ -38,7 +38,7 @@ body {
|
|||
|
||||
.btn-primary{
|
||||
text-decoration:none;
|
||||
color: #FFF;
|
||||
color: #FFF !important;
|
||||
background-color: #348eda;
|
||||
border:solid #348eda;
|
||||
border-width:10px 20px;
|
||||
|
|
@ -53,7 +53,7 @@ body {
|
|||
|
||||
.btn-secondary {
|
||||
text-decoration:none;
|
||||
color: #FFF;
|
||||
color: #FFF !important;
|
||||
background-color: #aaa;
|
||||
border:solid #aaa;
|
||||
border-width:10px 20px;
|
||||
|
|
|
|||
|
|
@ -12,9 +12,10 @@
|
|||
{% block content %}
|
||||
<ul class="nav nav-tabs view-selector">
|
||||
{%- for t in views -%}
|
||||
{% set url = (pathname if t.default else "{}?view={}".format(pathname, t.name)) %}
|
||||
<li class="{% if view.name==t.name -%} active {%- endif %} {% if t.hidden -%} hide {%- endif %}"
|
||||
data-view="{{ t.name }}">
|
||||
<a href="{{ t.url or '' }}"><i class="{{ t.icon }}"></i>
|
||||
<a href="{{ url or '' }}"><i class="{{ t.icon }}"></i>
|
||||
<span class="nav-label">{{ t.label }}</span></a>
|
||||
</li>
|
||||
{%- endfor -%}
|
||||
|
|
@ -26,11 +27,17 @@
|
|||
{%- endif -%}
|
||||
website.group = "{{ group.name }}";
|
||||
website.view = "{{ view.name }}";
|
||||
website.pathname = "{{ pathname }}";
|
||||
website.upvote = {{ 1 if view.upvote else 0 }};
|
||||
|
||||
{% if view.upvote %}
|
||||
website.setup_upvote();
|
||||
{% endif %}
|
||||
</script>
|
||||
|
||||
{% include view.template_path %}
|
||||
|
||||
<script>$(function() { website.toggle_upvote(); });</script>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}{% include "templates/includes/sidebar.html" %}{% endblock %}
|
||||
|
|
@ -3,23 +3,19 @@
|
|||
|
||||
import webnotes
|
||||
from webnotes.webutils import get_access, can_cache
|
||||
from webnotes.templates.website_group.post import clear_post_cache
|
||||
from webnotes.templates.website_group.forum import get_post_list_html
|
||||
|
||||
doctype = "Website Group"
|
||||
no_cache = 1
|
||||
|
||||
def get_context(context):
|
||||
bean = context.bean
|
||||
group, view = guess_group_view(bean, context)
|
||||
group, view = guess_group_view(context)
|
||||
|
||||
try:
|
||||
if not has_access(context.access, view):
|
||||
raise webnotes.PermissionError
|
||||
|
||||
group_context = get_group_context(group, view, bean, context)
|
||||
group_context.update(context)
|
||||
|
||||
return group_context
|
||||
|
||||
return get_group_context(group, view, context)
|
||||
|
||||
except webnotes.DoesNotExistError:
|
||||
return {
|
||||
|
|
@ -32,66 +28,85 @@ def get_context(context):
|
|||
'You are not permitted to view this page.</div>'
|
||||
}
|
||||
|
||||
def get_group_context(group, view, bean, context):
|
||||
def get_group_context(group, view, context):
|
||||
cache_key = "website_group_context:{}:{}".format(group, view)
|
||||
views = get_views(bean.doc.group_type)
|
||||
|
||||
views = get_views(context.bean.doc.group_type)
|
||||
view = webnotes._dict(views.get(view))
|
||||
|
||||
if can_cache(view.get("no_cache")):
|
||||
if can_cache(view.no_cache):
|
||||
group_context = webnotes.cache().get_value(cache_key)
|
||||
if group_context:
|
||||
return group_context
|
||||
|
||||
group_context = build_group_context(group, view, bean, views, context)
|
||||
group_context = build_group_context(group, view, views, context)
|
||||
|
||||
if can_cache(view.get("no_cache")):
|
||||
webnotes.cache().set_value(cache_key, group_context)
|
||||
|
||||
return group_context
|
||||
|
||||
def build_group_context(group, view, bean, views, context):
|
||||
title = "{} - {}".format(bean.doc.group_title, view.get("label"))
|
||||
|
||||
for name, opts in views.iteritems():
|
||||
opts["url"] = opts["url"].format(pathname=context.pathname, post="")
|
||||
def build_group_context(group, view, views, context):
|
||||
title = "{} - {}".format(context.bean.doc.group_title, view.get("label"))
|
||||
|
||||
group_context = webnotes._dict({
|
||||
"group": bean.doc.fields,
|
||||
"group": context.bean.doc.fields,
|
||||
"view": view,
|
||||
"views": (v[1] for v in sorted(views.iteritems(), key=lambda (k, v): v.get("idx"))),
|
||||
"title": title
|
||||
"views": [v[1] for v in sorted(views.iteritems(), key=lambda (k, v): v.get("idx"))],
|
||||
"title": title,
|
||||
"pathname": context.pathname
|
||||
})
|
||||
|
||||
handler = get_handler(bean.doc.group_type)
|
||||
if handler:
|
||||
group_context.update(handler.get_context(group_context))
|
||||
group_context.update(build_view_context(group_context))
|
||||
|
||||
return group_context
|
||||
|
||||
def build_view_context(context):
|
||||
from webnotes.templates.website_group.post import get_post_context
|
||||
|
||||
if context.view.name in ("popular", "feed", "open", "closed", "upcoming", "past"):
|
||||
context.post_list_html = get_post_list_html(context.group.name, context.view.name)
|
||||
|
||||
elif context.view.name == "edit":
|
||||
context.post = webnotes.doc("Post", webnotes.form_dict.name).fields
|
||||
|
||||
if context.post.assigned_to:
|
||||
context.profile = webnotes.doc("Profile", context.post.assigned_to)
|
||||
|
||||
def guess_group_view(bean, context):
|
||||
elif context.view.name == "settings":
|
||||
context.profiles = webnotes.conn.sql("""select p.*, wsp.`read`, wsp.`write`, wsp.`admin`
|
||||
from `tabProfile` p, `tabWebsite Sitemap Permission` wsp
|
||||
where wsp.website_sitemap=%s and wsp.profile=p.name""", context.pathname, as_dict=True)
|
||||
|
||||
elif context.view.name == "post":
|
||||
context.update(get_post_context(context))
|
||||
|
||||
return context
|
||||
|
||||
def guess_group_view(context):
|
||||
group = context.docname
|
||||
view = webnotes.form_dict.view
|
||||
|
||||
if not view:
|
||||
for v, opts in get_views(bean.doc.group_type).iteritems():
|
||||
if opts.get("default"):
|
||||
view = v
|
||||
break
|
||||
|
||||
view = webnotes.form_dict.view or get_default_view(context.bean.doc.group_type)
|
||||
return group, view
|
||||
|
||||
def get_handler(group_type):
|
||||
handler = webnotes.get_hooks("website_group_handler:{}".format(group_type))
|
||||
if handler:
|
||||
return webnotes.get_module(handler[0])
|
||||
def get_default_view(group_type):
|
||||
for view, opts in get_views(group_type).iteritems():
|
||||
if opts.get("default"):
|
||||
return view
|
||||
|
||||
def get_views(group_type):
|
||||
from copy import deepcopy
|
||||
handler = get_handler(group_type)
|
||||
if handler and hasattr(handler, "get_views"):
|
||||
return deepcopy(handler.get_views() or {})
|
||||
return {}
|
||||
def get_views(group_type=None):
|
||||
if group_type:
|
||||
group_views = webnotes._dict(views[group_type])
|
||||
else:
|
||||
group_views = {}
|
||||
for group_type in views:
|
||||
group_views.update(views[group_type].copy())
|
||||
|
||||
group_views.update(common_views)
|
||||
|
||||
if group_type == "Forum":
|
||||
group_views["post"]["upvote"] = True
|
||||
|
||||
return group_views
|
||||
|
||||
def has_access(access, view):
|
||||
if view=="settings":
|
||||
return access.get("admin")
|
||||
|
|
@ -100,26 +115,123 @@ def has_access(access, view):
|
|||
else:
|
||||
return access.get("read")
|
||||
|
||||
def clear_cache(page_name=None, website_group=None):
|
||||
if page_name or website_group:
|
||||
filters = {"page_name": page_name} if page_name else website_group
|
||||
|
||||
website_group = webnotes.conn.get_value("Website Group", filters,
|
||||
["page_name", "group_type"], as_dict=True)
|
||||
|
||||
if not website_group:
|
||||
return
|
||||
|
||||
def clear_cache(path=None, website_group=None):
|
||||
from webnotes.templates.website_group.post import clear_post_cache
|
||||
if path:
|
||||
website_groups = [webnotes.conn.get_value("Website Sitemap", path, "docname")]
|
||||
elif website_group:
|
||||
website_groups = [website_group]
|
||||
else:
|
||||
clear_post_cache()
|
||||
website_groups = webnotes.conn.sql("""select page_name, group_type from `tabWebsite Group`""", as_dict=True)
|
||||
website_groups = webnotes.conn.sql_list("""select name from `tabWebsite Group`""")
|
||||
|
||||
cache = webnotes.cache()
|
||||
all_views = get_views()
|
||||
for group in website_groups:
|
||||
for view in get_views(group.group_type):
|
||||
cache.delete_value("website_group_context:{}:{}".format(group.page_name, view))
|
||||
for view in all_views:
|
||||
cache.delete_value("website_group_context:{}:{}".format(group, view))
|
||||
|
||||
def clear_event_cache():
|
||||
for group in webnotes.conn.sql_list("""select name from `tabWebsite Group` where group_type='Event'"""):
|
||||
clear_unit_views(website_group=group)
|
||||
clear_unit_views(website_group=group)
|
||||
|
||||
def clear_cache_on_bean_event(bean, method, *args, **kwargs):
|
||||
clear_cache(path=bean.doc.website_sitemap, website_group=bean.doc.website_group)
|
||||
|
||||
def get_pathname(group):
|
||||
return webnotes.conn.get_value("Website Sitemap", {"ref_doctype": "Website Group",
|
||||
"docname": group})
|
||||
|
||||
views = {
|
||||
"Forum": {
|
||||
"popular": {
|
||||
"name": "popular",
|
||||
"template_path": "templates/website_group/forum.html",
|
||||
"label": "Popular",
|
||||
"icon": "icon-heart",
|
||||
"default": True,
|
||||
"upvote": True,
|
||||
"idx": 1
|
||||
},
|
||||
"feed": {
|
||||
"name": "feed",
|
||||
"template_path": "templates/website_group/forum.html",
|
||||
"label": "Feed",
|
||||
"icon": "icon-rss",
|
||||
"upvote": True,
|
||||
"idx": 2
|
||||
}
|
||||
},
|
||||
"Tasks": {
|
||||
"open": {
|
||||
"name": "open",
|
||||
"template_path": "templates/website_group/forum.html",
|
||||
"label": "Open",
|
||||
"icon": "icon-inbox",
|
||||
"default": True,
|
||||
"upvote": True,
|
||||
"idx": 1
|
||||
},
|
||||
"closed": {
|
||||
"name": "closed",
|
||||
"template_path": "templates/website_group/forum.html",
|
||||
"label": "Closed",
|
||||
"icon": "icon-smile",
|
||||
"idx": 2
|
||||
}
|
||||
},
|
||||
"Events": {
|
||||
"upcoming": {
|
||||
"name": "upcoming",
|
||||
"template_path": "templates/website_group/forum.html",
|
||||
"label": "Upcoming",
|
||||
"icon": "icon-calendar",
|
||||
"default": True,
|
||||
"idx": 1
|
||||
},
|
||||
"past": {
|
||||
"name": "past",
|
||||
"template_path": "templates/website_group/forum.html",
|
||||
"label": "Past",
|
||||
"icon": "icon-time",
|
||||
"idx": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
common_views = {
|
||||
"post": {
|
||||
"name": "post",
|
||||
"template_path": "templates/website_group/post.html",
|
||||
"label": "Post",
|
||||
"icon": "icon-comments",
|
||||
"hidden": True,
|
||||
"no_cache": True,
|
||||
"idx": 3
|
||||
},
|
||||
"edit": {
|
||||
"name": "edit",
|
||||
"template_path": "templates/website_group/edit_post.html",
|
||||
"label": "Edit Post",
|
||||
"icon": "icon-pencil",
|
||||
"hidden": True,
|
||||
"no_cache": True,
|
||||
"idx": 4
|
||||
},
|
||||
"add": {
|
||||
"name": "add",
|
||||
"template_path": "templates/website_group/edit_post.html",
|
||||
"label": "Add Post",
|
||||
"icon": "icon-plus",
|
||||
"hidden": True,
|
||||
"idx": 5
|
||||
},
|
||||
"settings": {
|
||||
"name": "settings",
|
||||
"template_path": "templates/website_group/settings.html",
|
||||
"label": "Settings",
|
||||
"icon": "icon-cog",
|
||||
"hidden": True,
|
||||
"idx": 6
|
||||
}
|
||||
}
|
||||
|
|
@ -20,7 +20,7 @@
|
|||
</h4>
|
||||
{%- endif -%}
|
||||
<ul class="list-inline small text-muted post-options">
|
||||
{% if view and view.upvote %}<li class="upvote">
|
||||
{% if view and view.upvote and not post.parent_post %}<li class="upvote">
|
||||
<a><span class="upvote-count {% if not post.upvotes %}hide{% endif %}">{{ post.upvotes }}</span>
|
||||
<i class="icon-thumbs-up"></i></a></li>{% endif %}
|
||||
{%- if not post.parent_post and view.name != "post" -%}
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group task-status {% if not (post and post.assigned_to) %}hide{% endif %}">
|
||||
<div class="form-group task-status {% if not post %}hide{% endif %}">
|
||||
<label>Status</label>
|
||||
<select class="form-control" data-fieldname="status">
|
||||
{% for opt in ("Open", "Closed") %}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,6 @@
|
|||
</div>
|
||||
<div class="media-body">
|
||||
<div>{{ profile.first_name or "" }} {{ profile.last_name or "" }}</div>
|
||||
<div class="text-muted"><small>{{ profile.fb_location or profile.fb_hometown or "" }}</small></div>
|
||||
<div class="text-muted"><small>{{ profile.location or "" }}</small></div>
|
||||
</div>
|
||||
</div>
|
||||
10
webnotes/templates/pages/login.py
Normal file
10
webnotes/templates/pages/login.py
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# MIT License. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import webnotes
|
||||
|
||||
def get_context(context):
|
||||
# get settings from site config
|
||||
if webnotes.conf.get("fb_app_id"):
|
||||
return { "fb_app_id": webnotes.conf.fb_app_id }
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
{% include "templates/includes/post_editor.html" %}
|
||||
|
||||
<script type="text/javascript" src="/assets/js/canvasResize.min.js"></script>
|
||||
<script>
|
||||
wn.require("/assets/js/canvasResize.min.js");
|
||||
$(function() {
|
||||
website.bind_add_post();
|
||||
|
||||
|
|
|
|||
|
|
@ -1,29 +0,0 @@
|
|||
<div class="small text-muted post-list-help"></div>
|
||||
<div class="post-list">
|
||||
{{ post_list_html }}
|
||||
</div>
|
||||
<div class="text-center">
|
||||
<button class="btn btn-default btn-more hide">More</button>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(function() {
|
||||
if($(".post").length===20) {
|
||||
wn.setup_pagination($(".btn-more"), {
|
||||
args: {
|
||||
cmd: "webnotes.templates.website_group.events.get_post_list_html",
|
||||
limit_start: $(".post").length,
|
||||
limit_length: 20,
|
||||
group: website.group,
|
||||
view: website.view
|
||||
},
|
||||
$wrapper: $(".post-list")
|
||||
});
|
||||
}
|
||||
|
||||
website.toggle_edit();
|
||||
website.setup_upvote();
|
||||
website.toggle_upvote();
|
||||
website.format_event_timestamps();
|
||||
});
|
||||
</script>
|
||||
|
|
@ -1,125 +0,0 @@
|
|||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# MIT License. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import webnotes
|
||||
from webnotes.utils import now_datetime, get_datetime_str
|
||||
from webnotes.webutils import get_access
|
||||
from webnotes.templates.website_group.settings import get_settings_context
|
||||
from webnotes.templates.website_group.post import get_post_context
|
||||
|
||||
def get_views():
|
||||
return views
|
||||
|
||||
def get_context(group_context):
|
||||
events_context = {}
|
||||
|
||||
if group_context.view.name in ("upcoming", "past"):
|
||||
events_context["post_list_html"] = get_post_list_html(group_context["group"]["name"], group_context["view"])
|
||||
|
||||
elif group_context.view.name == "edit":
|
||||
events_context["session_user"] = webnotes.session.user
|
||||
events_context["post"] = webnotes.doc("Post", webnotes.form_dict.name).fields
|
||||
|
||||
elif group_context.view.name == "settings":
|
||||
events_context.update(get_settings_context(group_context))
|
||||
|
||||
elif group_context.view.name == "post":
|
||||
events_context.update(get_post_context(group_context))
|
||||
|
||||
return events_context
|
||||
|
||||
@webnotes.whitelist(allow_guest=True)
|
||||
def get_post_list_html(group, view, limit_start=0, limit_length=20):
|
||||
access = get_access(group)
|
||||
|
||||
if isinstance(view, basestring):
|
||||
view = get_views()[view]
|
||||
|
||||
view = webnotes._dict(view)
|
||||
|
||||
# verify permission for paging
|
||||
if webnotes.local.form_dict.cmd == "get_post_list_html":
|
||||
if not access.get("read"):
|
||||
return webnotes.PermissionError
|
||||
|
||||
if view.name=="upcoming":
|
||||
condition = "and p.event_datetime >= %s"
|
||||
order_by = "p.event_datetime asc"
|
||||
else:
|
||||
condition = "and p.event_datetime < %s"
|
||||
order_by = "p.event_datetime desc"
|
||||
|
||||
# should show based on time upto precision of hour
|
||||
# because the current hour should also be in upcoming
|
||||
now = now_datetime().replace(minute=0, second=0, microsecond=0)
|
||||
|
||||
posts = webnotes.conn.sql("""select p.*, pr.user_image, pr.first_name, pr.last_name,
|
||||
(select count(pc.name) from `tabPost` pc where pc.parent_post=p.name) as post_reply_count
|
||||
from `tabPost` p, `tabProfile` pr
|
||||
where p.website_group = %s and pr.name = p.owner and ifnull(p.parent_post, '')=''
|
||||
and p.is_event=1 {condition}
|
||||
order by {order_by} limit %s, %s""".format(condition=condition, order_by=order_by),
|
||||
(group, now, int(limit_start), int(limit_length)), as_dict=True)
|
||||
|
||||
context = {"posts": posts, "limit_start": limit_start, "view": view}
|
||||
|
||||
return webnotes.get_template("templates/includes/post_list.html").render(context)
|
||||
|
||||
views = {
|
||||
"upcoming": {
|
||||
"name": "upcoming",
|
||||
"template_path": "templates/website_group/events.html",
|
||||
"url": "/{group}",
|
||||
"label": "Upcoming",
|
||||
"icon": "icon-calendar",
|
||||
"default": True,
|
||||
"idx": 1
|
||||
},
|
||||
"past": {
|
||||
"name": "past",
|
||||
"template_path": "templates/website_group/events.html",
|
||||
"url": "/{group}?view=past",
|
||||
"label": "Past",
|
||||
"icon": "icon-time",
|
||||
"idx": 2
|
||||
},
|
||||
"post": {
|
||||
"name": "post",
|
||||
"template_path": "templates/website_group/post.html",
|
||||
"url": "/{group}?view=post&name={post}",
|
||||
"label": "Post",
|
||||
"icon": "icon-comments",
|
||||
"hidden": True,
|
||||
"no_cache": True,
|
||||
"idx": 3
|
||||
},
|
||||
"edit": {
|
||||
"name": "edit",
|
||||
"template_path": "templates/website_group/edit_post.html",
|
||||
"url": "/{group}?view=edit&name={post}",
|
||||
"label": "Edit Post",
|
||||
"icon": "icon-pencil",
|
||||
"hidden": True,
|
||||
"no_cache": True,
|
||||
"idx": 4
|
||||
},
|
||||
"add": {
|
||||
"name": "add",
|
||||
"template_path": "templates/website_group/edit_post.html",
|
||||
"url": "/{group}?view=add",
|
||||
"label": "Add Post",
|
||||
"icon": "icon-plus",
|
||||
"hidden": True,
|
||||
"idx": 5
|
||||
},
|
||||
"settings": {
|
||||
"name": "settings",
|
||||
"template_path": "templates/website_group/settings.html",
|
||||
"url": "/{group}?view=settings",
|
||||
"label": "Settings",
|
||||
"icon": "icon-cog",
|
||||
"hidden": True,
|
||||
"idx": 6
|
||||
}
|
||||
}
|
||||
|
|
@ -9,21 +9,19 @@
|
|||
<script>
|
||||
$(function() {
|
||||
if($(".post").length===20) {
|
||||
wn.setup_pagination($(".btn-more"), {
|
||||
args: {
|
||||
cmd: "webnotes.templates.website_group.forum.get_post_list_html",
|
||||
limit_start: $(".post").length,
|
||||
limit_length: 20,
|
||||
group: website.group,
|
||||
view: website.view,
|
||||
pathname: website.pathname
|
||||
},
|
||||
$wrapper: $(".post-list")
|
||||
});
|
||||
wn.setup_pagination();
|
||||
}
|
||||
|
||||
{% if group.group_type == "Forum" -%}
|
||||
website.toggle_edit(true);
|
||||
website.setup_upvote();
|
||||
website.toggle_upvote();
|
||||
|
||||
{% elif group.group_type == "Tasks" %}
|
||||
website.toggle_edit();
|
||||
|
||||
{% elif group.group_type == "Events" %}
|
||||
website.toggle_edit();
|
||||
website.format_event_timestamps();
|
||||
|
||||
{%- endif %}
|
||||
});
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -5,120 +5,61 @@ from __future__ import unicode_literals
|
|||
import webnotes
|
||||
from webnotes.utils import now_datetime, get_datetime_str
|
||||
from webnotes.webutils import get_access
|
||||
from webnotes.templates.website_group.settings import get_settings_context
|
||||
from webnotes.templates.website_group.post import get_post_context
|
||||
|
||||
def get_views():
|
||||
return views
|
||||
|
||||
def get_context(group_context):
|
||||
forum_context = {}
|
||||
|
||||
if group_context.view.name in ("popular", "feed"):
|
||||
forum_context["post_list_html"] = get_post_list_html(group_context["group"]["name"], group_context["view"], group_context.pathname)
|
||||
|
||||
elif group_context.view.name == "edit":
|
||||
forum_context["session_user"] = webnotes.session.user
|
||||
forum_context["post"] = webnotes.doc("Post", webnotes.form_dict.name).fields
|
||||
|
||||
elif group_context.view.name == "settings":
|
||||
forum_context.update(get_settings_context(group_context))
|
||||
|
||||
elif group_context.view.name == "post":
|
||||
forum_context.update(get_post_context(group_context))
|
||||
|
||||
return forum_context
|
||||
|
||||
@webnotes.whitelist(allow_guest=True)
|
||||
def get_post_list_html(group, view, pathname, limit_start=0, limit_length=20):
|
||||
print pathname
|
||||
access = get_access(pathname)
|
||||
|
||||
if isinstance(view, basestring):
|
||||
view = get_views()[view]
|
||||
|
||||
view = webnotes._dict(view)
|
||||
def get_post_list_html(group, view, limit_start=0, limit_length=20):
|
||||
from webnotes.templates.generators.website_group import get_views
|
||||
|
||||
# verify permission for paging
|
||||
if webnotes.local.form_dict.cmd == "get_post_list_html":
|
||||
pathname = webnotes.conn.get_value("Website Sitemap",
|
||||
{"ref_doctype": "Website Group", "docname": group})
|
||||
access = get_access(pathname)
|
||||
|
||||
if not access.get("read"):
|
||||
return webnotes.PermissionError
|
||||
|
||||
if view.name == "feed":
|
||||
conditions = ""
|
||||
values = [group]
|
||||
|
||||
group_type = webnotes.conn.get_value("Website Group", group, "group_type")
|
||||
if group_type == "Events":
|
||||
# should show based on time upto precision of hour
|
||||
# because the current hour should also be in upcoming
|
||||
values.append(now_datetime().replace(minute=0, second=0, microsecond=0))
|
||||
|
||||
if view in ("feed", "closed"):
|
||||
order_by = "p.creation desc"
|
||||
else:
|
||||
|
||||
if view == "closed":
|
||||
conditions += " and p.is_task=1 and p.status='Closed'"
|
||||
|
||||
elif view in ("popular", "open"):
|
||||
now = get_datetime_str(now_datetime())
|
||||
order_by = """(p.upvotes + post_reply_count - (timestampdiff(hour, p.creation, \"{}\") / 2)) desc,
|
||||
p.creation desc""".format(now)
|
||||
|
||||
if view == "open":
|
||||
conditions += " and p.is_task=1 and p.status='Open'"
|
||||
|
||||
elif view == "upcoming":
|
||||
conditions += " and p.is_event=1 and p.event_datetime >= %s"
|
||||
order_by = "p.event_datetime asc"
|
||||
|
||||
elif view == "past":
|
||||
conditions += " and p.is_event=1 and p.event_datetime < %s"
|
||||
order_by = "p.event_datetime desc"
|
||||
|
||||
values += [int(limit_start), int(limit_length)]
|
||||
|
||||
posts = webnotes.conn.sql("""select p.*, pr.user_image, pr.first_name, pr.last_name,
|
||||
(select count(pc.name) from `tabPost` pc where pc.parent_post=p.name) as post_reply_count
|
||||
from `tabPost` p, `tabProfile` pr
|
||||
where p.website_group = %s and pr.name = p.owner and ifnull(p.parent_post, '')=''
|
||||
order by {order_by} limit %s, %s""".format(order_by=order_by),
|
||||
(group, int(limit_start), int(limit_length)), as_dict=True)
|
||||
|
||||
context = {"posts": posts, "limit_start": limit_start, "view": view}
|
||||
where p.website_group = %s and pr.name = p.owner and ifnull(p.parent_post, '')=''
|
||||
{conditions} order by {order_by} limit %s, %s""".format(conditions=conditions, order_by=order_by),
|
||||
tuple(values), as_dict=True, debug=True)
|
||||
|
||||
context = { "posts": posts, "limit_start": limit_start, "view": get_views(group_type)[view] }
|
||||
|
||||
return webnotes.get_template("templates/includes/post_list.html").render(context)
|
||||
|
||||
views = {
|
||||
"popular": {
|
||||
"name": "popular",
|
||||
"template_path": "templates/website_group/forum.html",
|
||||
"url": "{pathname}",
|
||||
"label": "Popular",
|
||||
"icon": "icon-heart",
|
||||
"default": True,
|
||||
"upvote": True,
|
||||
"idx": 1
|
||||
},
|
||||
"feed": {
|
||||
"name": "feed",
|
||||
"template_path": "templates/website_group/forum.html",
|
||||
"url": "/{pathname}?view=feed",
|
||||
"label": "Feed",
|
||||
"icon": "icon-rss",
|
||||
"upvote": True,
|
||||
"idx": 2
|
||||
},
|
||||
"post": {
|
||||
"name": "post",
|
||||
"template_path": "templates/website_group/post.html",
|
||||
"url": "/{pathname}?view=post&name={post}",
|
||||
"label": "Post",
|
||||
"icon": "icon-comments",
|
||||
"upvote": True,
|
||||
"hidden": True,
|
||||
"no_cache": True,
|
||||
"idx": 3
|
||||
},
|
||||
"edit": {
|
||||
"name": "edit",
|
||||
"template_path": "templates/website_group/edit_post.html",
|
||||
"url": "/{pathname}?view=edit&name={post}",
|
||||
"label": "Edit Post",
|
||||
"icon": "icon-pencil",
|
||||
"hidden": True,
|
||||
"no_cache": True,
|
||||
"idx": 4
|
||||
},
|
||||
"add": {
|
||||
"name": "add",
|
||||
"template_path": "templates/website_group/edit_post.html",
|
||||
"url": "/{pathname}?view=add",
|
||||
"label": "Add Post",
|
||||
"icon": "icon-plus",
|
||||
"hidden": True,
|
||||
"idx": 5
|
||||
},
|
||||
"settings": {
|
||||
"name": "settings",
|
||||
"template_path": "templates/website_group/settings.html",
|
||||
"url": "/{pathname}?view=settings",
|
||||
"label": "Settings",
|
||||
"icon": "icon-cog",
|
||||
"hidden": True,
|
||||
"idx": 6
|
||||
}
|
||||
}
|
||||
|
|
@ -12,11 +12,10 @@
|
|||
{% include "templates/includes/post_editor.html" %}
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="/assets/js/canvasResize.min.js"></script>
|
||||
<script>
|
||||
wn.require("/assets/js/canvasResize.min.js");
|
||||
$(function() {
|
||||
website.toggle_edit(true);
|
||||
website.setup_upvote();
|
||||
website.toggle_upvote();
|
||||
website.bind_add_post();
|
||||
|
||||
|
|
|
|||
|
|
@ -4,8 +4,11 @@
|
|||
from __future__ import unicode_literals
|
||||
import webnotes
|
||||
from webnotes.utils import get_fullname
|
||||
from webnotes.webutils import get_access
|
||||
from webnotes.utils.file_manager import save_file
|
||||
from webnotes.templates.generators.website_group import get_pathname
|
||||
|
||||
def get_post_context(group_context):
|
||||
def get_post_context(context):
|
||||
post = webnotes.doc("Post", webnotes.form_dict.name)
|
||||
if post.parent_post:
|
||||
raise webnotes.PermissionError
|
||||
|
|
@ -14,24 +17,23 @@ def get_post_context(group_context):
|
|||
fullname = get_fullname(post.owner)
|
||||
return {
|
||||
"title": "{} by {}".format(post.title, fullname),
|
||||
# "group_title": group_context.get("unit_title") + " by {}".format(fullname),
|
||||
"parent_post_html": get_parent_post_html(post, group_context.get("view")),
|
||||
"post_list_html": get_child_posts_html(post, group_context.get("view")),
|
||||
"parent_post_html": get_parent_post_html(post, context),
|
||||
"post_list_html": get_child_posts_html(post, context),
|
||||
"parent_post": post.name
|
||||
}
|
||||
|
||||
cache_key = "website_group_post:{}".format(post.name)
|
||||
return webnotes.cache().get_value(cache_key, lambda: _get_post_context())
|
||||
|
||||
def get_parent_post_html(post, view):
|
||||
def get_parent_post_html(post, context):
|
||||
profile = webnotes.bean("Profile", post.owner).doc
|
||||
for fieldname in ("first_name", "last_name", "user_image", "location"):
|
||||
post.fields[fieldname] = profile.fields[fieldname]
|
||||
|
||||
return webnotes.get_template("templates/includes/inline_post.html")\
|
||||
.render({"post": post.fields, "view": view})
|
||||
.render({"post": post.fields, "view": context.view})
|
||||
|
||||
def get_child_posts_html(post, view):
|
||||
def get_child_posts_html(post, context):
|
||||
posts = webnotes.conn.sql("""select p.*, pr.user_image, pr.first_name, pr.last_name
|
||||
from tabPost p, tabProfile pr
|
||||
where p.parent_post=%s and pr.name = p.owner
|
||||
|
|
@ -41,7 +43,7 @@ def get_child_posts_html(post, view):
|
|||
.render({
|
||||
"posts": posts,
|
||||
"parent_post": post.name,
|
||||
"view": view
|
||||
"view": context.view
|
||||
})
|
||||
|
||||
def clear_post_cache(post=None):
|
||||
|
|
@ -49,4 +51,105 @@ def clear_post_cache(post=None):
|
|||
posts = [post] if post else webnotes.conn.sql_list("select name from `tabPost`")
|
||||
|
||||
for post in posts:
|
||||
cache.delete_value("website_group_post:{}".format(post))
|
||||
cache.delete_value("website_group_post:{}".format(post))
|
||||
|
||||
@webnotes.whitelist(allow_guest=True)
|
||||
def add_post(group, content, picture, picture_name, title=None, parent_post=None,
|
||||
assigned_to=None, status=None, event_datetime=None):
|
||||
|
||||
access = get_access(get_pathname(group))
|
||||
if not access.get("write"):
|
||||
raise webnotes.PermissionError
|
||||
|
||||
if parent_post:
|
||||
if webnotes.conn.get_value("Post", parent_post, "parent_post"):
|
||||
webnotes.throw("Cannot reply to a reply")
|
||||
|
||||
group = webnotes.doc("Website Group", group)
|
||||
post = webnotes.bean({
|
||||
"doctype":"Post",
|
||||
"title": (title or "").title(),
|
||||
"content": content,
|
||||
"website_group": group.name,
|
||||
"parent_post": parent_post or None
|
||||
})
|
||||
|
||||
if not parent_post:
|
||||
if group.group_type == "Tasks":
|
||||
post.doc.is_task = 1
|
||||
post.doc.assigned_to = assigned_to
|
||||
elif group.group_type == "Events":
|
||||
post.doc.is_event = 1
|
||||
post.doc.event_datetime = event_datetime
|
||||
|
||||
post.ignore_permissions = True
|
||||
post.insert()
|
||||
|
||||
if picture_name and picture:
|
||||
process_picture(post, picture_name, picture)
|
||||
|
||||
# send email
|
||||
if parent_post:
|
||||
post.run_method("send_email_on_reply")
|
||||
|
||||
return post.doc.parent_post or post.doc.name
|
||||
|
||||
@webnotes.whitelist(allow_guest=True)
|
||||
def save_post(post, content, picture=None, picture_name=None, title=None,
|
||||
assigned_to=None, status=None, event_datetime=None):
|
||||
|
||||
post = webnotes.bean("Post", post)
|
||||
access = get_access(get_pathname(post.doc.website_group))
|
||||
|
||||
if not access.get("write"):
|
||||
raise webnotes.PermissionError
|
||||
|
||||
# TODO improve error message
|
||||
if webnotes.session.user != post.doc.owner:
|
||||
for fieldname in ("title", "content"):
|
||||
if post.doc.fields.get(fieldname) != locals().get(fieldname):
|
||||
webnotes.throw("You cannot change: {}".format(fieldname.title()))
|
||||
|
||||
if picture and picture_name:
|
||||
webnotes.throw("You cannot change: Picture")
|
||||
|
||||
post.doc.fields.update({
|
||||
"title": (title or "").title(),
|
||||
"content": content,
|
||||
"assigned_to": assigned_to,
|
||||
"status": status,
|
||||
"event_datetime": event_datetime
|
||||
})
|
||||
post.ignore_permissions = True
|
||||
post.save()
|
||||
|
||||
if picture_name and picture:
|
||||
process_picture(post, picture_name, picture)
|
||||
|
||||
return post.doc.parent_post or post.doc.name
|
||||
|
||||
def process_picture(post, picture_name, picture):
|
||||
from webnotes.templates.generators.website_group import clear_cache
|
||||
|
||||
file_data = save_file(picture_name, picture, "Post", post.doc.name, decode=True)
|
||||
post.doc.picture_url = file_data.file_name or file_data.file_url
|
||||
webnotes.conn.set_value("Post", post.doc.name, "picture_url", post.doc.picture_url)
|
||||
clear_cache(website_group=post.doc.website_group)
|
||||
|
||||
@webnotes.whitelist()
|
||||
def suggest_user(group, term):
|
||||
"""suggest a user that has read permission in this group tree"""
|
||||
profiles = webnotes.conn.sql("""select
|
||||
pr.name, pr.first_name, pr.last_name,
|
||||
pr.user_image, pr.location
|
||||
from `tabProfile` pr
|
||||
where (pr.first_name like %(term)s or pr.last_name like %(term)s)
|
||||
and pr.user_type = 'Website User' and pr.enabled=1""",
|
||||
{"term": "%{}%".format(term), "group": group}, as_dict=True)
|
||||
|
||||
template = webnotes.get_template("templates/includes/profile_display.html")
|
||||
return [{
|
||||
"value": "{} {}".format(pr.first_name or "", pr.last_name or "").strip(),
|
||||
"profile_html": template.render({"profile": pr}),
|
||||
"profile": pr.name
|
||||
} for pr in profiles]
|
||||
|
|
|
|||
|
|
@ -3,46 +3,42 @@
|
|||
|
||||
from __future__ import unicode_literals
|
||||
import webnotes
|
||||
from webnotes.webutils import get_access
|
||||
from webnotes.website.doctype.website_sitemap_permission.website_sitemap_permission import clear_permissions
|
||||
from webnotes.webutils import get_access, clear_permissions
|
||||
from webnotes.templates.generators.website_group import get_pathname
|
||||
from webnotes.utils.email_lib.bulk import send
|
||||
|
||||
def get_settings_context(group_context):
|
||||
if not get_access(group_context.group.name).get("admin"):
|
||||
raise webnotes.PermissionError
|
||||
|
||||
return {
|
||||
"profiles": webnotes.conn.sql("""select p.*, wsp.`read`, wsp.`write`, wsp.`admin`
|
||||
from `tabProfile` p, `tabWebsite Sitemap Permission` wsp
|
||||
where wsp.website_sitemap=%s and wsp.profile=p.name""", (group_context.group.name,), as_dict=True)
|
||||
}
|
||||
|
||||
@webnotes.whitelist()
|
||||
def suggest_user(term, group):
|
||||
pathname = get_pathname(group)
|
||||
if not get_access(pathname).get("admin"):
|
||||
raise webnotes.PermissionError
|
||||
|
||||
profiles = webnotes.conn.sql("""select pr.name, pr.first_name, pr.last_name,
|
||||
pr.user_image, pr.fb_location, pr.fb_hometown
|
||||
pr.user_image, pr.location
|
||||
from `tabProfile` pr
|
||||
where (pr.first_name like %(term)s or pr.last_name like %(term)s)
|
||||
and pr.user_type = "Website User"
|
||||
and pr.user_image is not null and pr.enabled=1
|
||||
and not exists(select wsp.name from `tabWebsite Sitemap Permission` wsp
|
||||
where wsp.website_sitemap=%(group)s and wsp.profile=pr.name)""",
|
||||
{"term": "%{}%".format(term), "group": group}, as_dict=True)
|
||||
{"term": "%{}%".format(term), "group": pathname}, as_dict=True)
|
||||
|
||||
template = webnotes.get_template("templates/includes/profile_display.html")
|
||||
return [{
|
||||
"value": "{} {}".format(pr.first_name, pr.last_name),
|
||||
"value": "{} {}".format(pr.first_name or "", pr.last_name or ""),
|
||||
"profile_html": template.render({"profile": pr}),
|
||||
"profile": pr.name
|
||||
} for pr in profiles]
|
||||
|
||||
@webnotes.whitelist()
|
||||
def add_sitemap_permission(sitemap_page, profile):
|
||||
if not get_access(sitemap_page).get("admin"):
|
||||
def add_sitemap_permission(group, profile):
|
||||
pathname = get_pathname(group)
|
||||
if not get_access(pathname).get("admin"):
|
||||
raise webnotes.PermissionError
|
||||
|
||||
permission = webnotes.bean({
|
||||
"doctype": "Website Sitemap Permission",
|
||||
"website_sitemap": sitemap_page,
|
||||
"website_sitemap": pathname,
|
||||
"profile": profile,
|
||||
"read": 1
|
||||
})
|
||||
|
|
@ -50,24 +46,25 @@ def add_sitemap_permission(sitemap_page, profile):
|
|||
|
||||
profile = permission.doc.fields
|
||||
profile.update(webnotes.conn.get_value("Profile", profile.profile,
|
||||
["name", "first_name", "last_name", "user_image", "fb_location", "fb_hometown"], as_dict=True))
|
||||
["name", "first_name", "last_name", "user_image", "location"], as_dict=True))
|
||||
|
||||
return webnotes.get_template("templates/includes/sitemap_permission.html").render({
|
||||
"profile": profile
|
||||
})
|
||||
|
||||
@webnotes.whitelist()
|
||||
def update_permission(sitemap_page, profile, perm, value):
|
||||
if not get_access(sitemap_page).get("admin"):
|
||||
def update_permission(group, profile, perm, value):
|
||||
pathname = get_pathname(group)
|
||||
if not get_access(pathname).get("admin"):
|
||||
raise webnotes.PermissionError
|
||||
|
||||
permission = webnotes.bean("Website Sitemap Permission", {"website_sitemap": sitemap_page, "profile": profile})
|
||||
|
||||
permission = webnotes.bean("Website Sitemap Permission", {"website_sitemap": pathname, "profile": profile})
|
||||
permission.doc.fields[perm] = int(value)
|
||||
permission.save(ignore_permissions=True)
|
||||
|
||||
# send email
|
||||
if perm=="admin" and int(value):
|
||||
group_title = webnotes.conn.get_value("Website Sitemap", sitemap_page, "page_title")
|
||||
group_title = webnotes.conn.get_value("Website Sitemap", pathname, "page_title")
|
||||
|
||||
subject = "You have been made Administrator of Group " + group_title
|
||||
|
||||
|
|
@ -79,7 +76,7 @@ def update_permission(sitemap_page, profile, perm, value):
|
|||
|
||||
@webnotes.whitelist()
|
||||
def update_description(group, description):
|
||||
if not get_access(group).get("admin"):
|
||||
if not get_access(get_pathname(group)).get("admin"):
|
||||
raise webnotes.PermissionError
|
||||
|
||||
group = webnotes.bean("Website Group", group)
|
||||
|
|
@ -88,7 +85,7 @@ def update_description(group, description):
|
|||
|
||||
@webnotes.whitelist()
|
||||
def add_website_group(group, new_group, public_read, public_write, group_type="Forum"):
|
||||
if not get_access(group).get("admin"):
|
||||
if not get_access(get_pathname(group)).get("admin"):
|
||||
raise webnotes.PermissionError
|
||||
|
||||
parent_website_sitemap = webnotes.conn.get_value("Website Sitemap",
|
||||
|
|
|
|||
|
|
@ -1,32 +0,0 @@
|
|||
<div class="small text-muted post-list-help"></div>
|
||||
<div class="post-list">
|
||||
{{ post_list_html }}
|
||||
</div>
|
||||
<div class="text-center">
|
||||
<button class="btn btn-default btn-more hide">More</button>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(function() {
|
||||
if($(".post").length===20) {
|
||||
wn.setup_pagination($(".btn-more"), {
|
||||
args: {
|
||||
cmd: "webnotes.templates.website_group.tasks.get_post_list_html",
|
||||
limit_start: $(".post").length,
|
||||
limit_length: 20,
|
||||
group: website.group,
|
||||
view: website.view,
|
||||
status: "Closed" ? view=="closed" : undefined
|
||||
},
|
||||
$wrapper: $(".post-list")
|
||||
});
|
||||
}
|
||||
|
||||
{%- if view.name == "open" -%}
|
||||
website.setup_upvote();
|
||||
website.toggle_upvote();
|
||||
{%- endif -%}
|
||||
|
||||
website.toggle_edit();
|
||||
});
|
||||
</script>
|
||||
|
|
@ -1,126 +0,0 @@
|
|||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# MIT License. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import webnotes
|
||||
from webnotes.utils import now_datetime, get_datetime_str
|
||||
from webnotes.webutils import get_access
|
||||
from webnotes.templates.website_group.settings import get_settings_context
|
||||
from webnotes.templates.website_group.post import get_post_context
|
||||
|
||||
def get_views():
|
||||
return views
|
||||
|
||||
def get_context(group_context):
|
||||
tasks_context = {}
|
||||
|
||||
if group_context.view.name in ("open", "closed"):
|
||||
tasks_context["post_list_html"] = get_post_list_html(group_context["group"]["name"], group_context["view"])
|
||||
|
||||
elif group_context.view.name == "edit":
|
||||
post = webnotes.doc("Post", webnotes.form_dict.name).fields
|
||||
tasks_context["session_user"] = webnotes.session.user
|
||||
tasks_context["post"] = post
|
||||
if post.assigned_to:
|
||||
tasks_context["profile"] = webnotes.doc("Profile", post.assigned_to)
|
||||
|
||||
elif group_context.view.name == "settings":
|
||||
tasks_context.update(get_settings_context(group_context))
|
||||
|
||||
elif group_context.view.name == "post":
|
||||
tasks_context.update(get_post_context(group_context))
|
||||
|
||||
return tasks_context
|
||||
|
||||
@webnotes.whitelist(allow_guest=True)
|
||||
def get_post_list_html(group, view, limit_start=0, limit_length=20, status="Open"):
|
||||
access = get_access(group)
|
||||
|
||||
if isinstance(view, basestring):
|
||||
view = get_views()[view]
|
||||
|
||||
view = webnotes._dict(view)
|
||||
|
||||
# verify permission for paging
|
||||
if webnotes.local.form_dict.cmd == "get_post_list_html":
|
||||
if not access.get("read"):
|
||||
return webnotes.PermissionError
|
||||
|
||||
if view.name=="open":
|
||||
now = get_datetime_str(now_datetime())
|
||||
order_by = "(p.upvotes + post_reply_count - (timestampdiff(hour, p.creation, \"{}\") / 2)) desc, p.creation desc".format(now)
|
||||
else:
|
||||
status = "Closed"
|
||||
order_by = "p.creation desc"
|
||||
|
||||
posts = webnotes.conn.sql("""select p.*, pr.user_image, pr.first_name, pr.last_name,
|
||||
(select count(pc.name) from `tabPost` pc where pc.parent_post=p.name) as post_reply_count
|
||||
from `tabPost` p, `tabProfile` pr
|
||||
where p.website_group = %s and pr.name = p.owner and ifnull(p.parent_post, '')=''
|
||||
and p.is_task=1 and p.status=%s
|
||||
order by {order_by} limit %s, %s""".format(order_by=order_by),
|
||||
(group, status, int(limit_start), int(limit_length)), as_dict=True)
|
||||
|
||||
context = {"posts": posts, "limit_start": limit_start, "view": view}
|
||||
|
||||
return webnotes.get_template("templates/includes/post_list.html").render(context)
|
||||
|
||||
views = {
|
||||
"open": {
|
||||
"name": "open",
|
||||
"template_path": "templates/website_group/tasks.html",
|
||||
"url": "/{group}",
|
||||
"label": "Open",
|
||||
"icon": "icon-inbox",
|
||||
"default": True,
|
||||
"upvote": True,
|
||||
"idx": 1
|
||||
},
|
||||
"closed": {
|
||||
"name": "closed",
|
||||
"template_path": "templates/website_group/tasks.html",
|
||||
"url": "/{group}?view=closed",
|
||||
"label": "Closed",
|
||||
"icon": "icon-smile",
|
||||
"idx": 2
|
||||
},
|
||||
"post": {
|
||||
"name": "post",
|
||||
"template_path": "templates/website_group/post.html",
|
||||
"url": "/{group}?view=post&name={post}",
|
||||
"label": "Post",
|
||||
"icon": "icon-comments",
|
||||
"hidden": True,
|
||||
"no_cache": True,
|
||||
"upvote": True,
|
||||
"idx": 3
|
||||
},
|
||||
"edit": {
|
||||
"name": "edit",
|
||||
"template_path": "templates/website_group/edit_post.html",
|
||||
"url": "/{group}?view=edit&name={post}",
|
||||
"label": "Edit Post",
|
||||
"icon": "icon-pencil",
|
||||
"hidden": True,
|
||||
"no_cache": True,
|
||||
"idx": 4
|
||||
},
|
||||
"add": {
|
||||
"name": "add",
|
||||
"template_path": "templates/website_group/edit_post.html",
|
||||
"url": "/{group}?view=add",
|
||||
"label": "Add Post",
|
||||
"icon": "icon-plus",
|
||||
"hidden": True,
|
||||
"idx": 5
|
||||
},
|
||||
"settings": {
|
||||
"name": "settings",
|
||||
"template_path": "templates/website_group/settings.html",
|
||||
"url": "/{group}?view=settings",
|
||||
"label": "Settings",
|
||||
"icon": "icon-cog",
|
||||
"hidden": True,
|
||||
"idx": 6
|
||||
}
|
||||
}
|
||||
|
|
@ -9,9 +9,6 @@ import webnotes
|
|||
from webnotes.utils import get_fullname
|
||||
from webnotes.utils.email_lib.bulk import send
|
||||
from webnotes.utils.email_lib import sendmail
|
||||
from webnotes.utils.file_manager import save_file
|
||||
|
||||
from webnotes.webutils import get_access
|
||||
from webnotes.templates.generators.website_group import clear_cache
|
||||
from webnotes.templates.website_group.post import clear_post_cache
|
||||
|
||||
|
|
@ -99,102 +96,3 @@ class DocType:
|
|||
message += "<p><a href='/post/{post_name}'>Click here to view the post</a></p>".format(fullname=owner_fullname,
|
||||
post_name=post_name)
|
||||
return message
|
||||
|
||||
@webnotes.whitelist(allow_guest=True)
|
||||
def add_post(group, content, picture, picture_name, title=None, parent_post=None,
|
||||
assigned_to=None, status=None, event_datetime=None):
|
||||
|
||||
access = get_access(group)
|
||||
if not access.get("write"):
|
||||
raise webnotes.PermissionError
|
||||
|
||||
if parent_post:
|
||||
if webnotes.conn.get_value("Post", parent_post, "parent_post"):
|
||||
webnotes.throw("Cannot reply to a reply")
|
||||
|
||||
group = webnotes.doc("Website Group", group)
|
||||
post = webnotes.bean({
|
||||
"doctype":"Post",
|
||||
"title": (title or "").title(),
|
||||
"content": content,
|
||||
"website_group": group.name,
|
||||
"parent_post": parent_post or None
|
||||
})
|
||||
|
||||
if not parent_post:
|
||||
if group.group_type == "Tasks":
|
||||
post.doc.is_task = 1
|
||||
post.doc.assigned_to = assigned_to
|
||||
elif group.group_type == "Events":
|
||||
post.doc.is_event = 1
|
||||
post.doc.event_datetime = event_datetime
|
||||
|
||||
post.ignore_permissions = True
|
||||
post.insert()
|
||||
|
||||
if picture_name and picture:
|
||||
process_picture(post, picture_name, picture)
|
||||
|
||||
# send email
|
||||
if parent_post:
|
||||
post.run_method("send_email_on_reply")
|
||||
|
||||
return post.doc.parent_post or post.doc.name
|
||||
|
||||
@webnotes.whitelist(allow_guest=True)
|
||||
def save_post(post, content, picture=None, picture_name=None, title=None,
|
||||
assigned_to=None, status=None, event_datetime=None):
|
||||
|
||||
post = webnotes.bean("Post", post)
|
||||
|
||||
access = get_access(post.doc.website_group)
|
||||
if not access.get("write"):
|
||||
raise webnotes.PermissionError
|
||||
|
||||
# TODO improve error message
|
||||
if webnotes.session.user != post.doc.owner:
|
||||
for fieldname in ("title", "content"):
|
||||
if post.doc.fields.get(fieldname) != locals().get(fieldname):
|
||||
webnotes.throw("You cannot change: {}".format(fieldname.title()))
|
||||
|
||||
if picture and picture_name:
|
||||
webnotes.throw("You cannot change: Picture")
|
||||
|
||||
post.doc.fields.update({
|
||||
"title": (title or "").title(),
|
||||
"content": content,
|
||||
"assigned_to": assigned_to,
|
||||
"status": status,
|
||||
"event_datetime": event_datetime
|
||||
})
|
||||
post.ignore_permissions = True
|
||||
post.save()
|
||||
|
||||
if picture_name and picture:
|
||||
process_picture(post, picture_name, picture)
|
||||
|
||||
return post.doc.parent_post or post.doc.name
|
||||
|
||||
def process_picture(post, picture_name, picture):
|
||||
file_data = save_file(picture_name, picture, "Post", post.doc.name, decode=True)
|
||||
post.doc.picture_url = file_data.file_name or file_data.file_url
|
||||
webnotes.conn.set_value("Post", post.doc.name, "picture_url", post.doc.picture_url)
|
||||
clear_cache(website_group=post.doc.website_group)
|
||||
|
||||
@webnotes.whitelist()
|
||||
def suggest_user(group, term):
|
||||
"""suggest a user that has read permission in this group tree"""
|
||||
profiles = webnotes.conn.sql("""select
|
||||
pr.name, pr.first_name, pr.last_name,
|
||||
pr.user_image, pr.fb_location, pr.fb_hometown
|
||||
from `tabProfile` pr
|
||||
where (pr.first_name like %(term)s or pr.last_name like %(term)s)
|
||||
and pr.name not in ("Guest", "Administrator") is not null and pr.enabled=1""",
|
||||
{"term": "%{}%".format(term), "group": group}, as_dict=True)
|
||||
|
||||
template = webnotes.get_template("templates/includes/profile_display.html")
|
||||
return [{
|
||||
"value": "{} {}".format(pr.first_name or "", pr.last_name or "").strip(),
|
||||
"profile_html": template.render({"profile": pr}),
|
||||
"profile": pr.name
|
||||
} for pr in profiles]
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# MIT License. See license.txt
|
||||
|
||||
# For license information, please see license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import webnotes
|
||||
from webnotes.webutils import get_access
|
||||
|
|
@ -37,7 +35,10 @@ def on_doctype_update():
|
|||
@webnotes.whitelist()
|
||||
def set_vote(ref_doctype, ref_name):
|
||||
website_group = webnotes.conn.get_value(ref_doctype, ref_name, "website_group")
|
||||
if not get_access(website_group).get("read"):
|
||||
pathname = webnotes.conn.get_value("Website Sitemap", {"ref_doctype": "Website Group",
|
||||
"docname": website_group})
|
||||
|
||||
if not get_access(pathname).get("read"):
|
||||
raise webnotes.PermissionError
|
||||
|
||||
try:
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@
|
|||
|
||||
from __future__ import unicode_literals
|
||||
import webnotes
|
||||
from webnotes.webutils import WebsiteGenerator, cleanup_page_name
|
||||
from webnotes.templates.generators.website_group import get_context
|
||||
from webnotes.webutils import WebsiteGenerator
|
||||
from webnotes.templates.generators.website_group import clear_cache
|
||||
from webnotes.model.doc import make_autoname
|
||||
|
||||
class DocType(WebsiteGenerator):
|
||||
|
|
@ -15,4 +15,11 @@ class DocType(WebsiteGenerator):
|
|||
self.doc.name = make_autoname("Website-Group-.######")
|
||||
|
||||
def get_page_title(self):
|
||||
return self.doc.group_title
|
||||
return self.doc.group_title
|
||||
|
||||
def on_update(self):
|
||||
WebsiteGenerator.on_update(self)
|
||||
clear_cache(website_group=self.doc.name)
|
||||
|
||||
def after_insert(self):
|
||||
clear_cache(path=self.doc.parent_website_sitemap)
|
||||
|
|
@ -14,7 +14,7 @@ class DocType(DocListController):
|
|||
|
||||
def validate_home_page(self):
|
||||
if self.doc.home_page and \
|
||||
not webnotes.conn.get_value("Website Sitemap", {"page_name": self.doc.home_page}):
|
||||
not webnotes.conn.get_value("Website Sitemap", {"name": self.doc.home_page}):
|
||||
webnotes.throw(_("Invalid Home Page") + " (Standard pages - index, login, products, blog, about, contact)")
|
||||
|
||||
def validate_top_bar_items(self):
|
||||
|
|
|
|||
|
|
@ -2,13 +2,14 @@
|
|||
{
|
||||
"creation": "2014-01-29 17:56:29",
|
||||
"docstatus": 0,
|
||||
"modified": "2014-01-29 18:05:29",
|
||||
"modified": "2014-02-11 19:26:33",
|
||||
"modified_by": "Administrator",
|
||||
"owner": "Administrator"
|
||||
},
|
||||
{
|
||||
"autoname": "WSP.######",
|
||||
"doctype": "DocType",
|
||||
"icon": "icon-shield",
|
||||
"module": "Website",
|
||||
"name": "__common__"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ $.extend(wn, {
|
|||
require: function(url) {
|
||||
if(wn._assets_loaded.indexOf(url)!==-1) return;
|
||||
$.ajax({
|
||||
url: url, //+ "?q=" + Math.floor(Math.random() * 1000),
|
||||
url: url,
|
||||
async: false,
|
||||
dataType: "text",
|
||||
success: function(data) {
|
||||
|
|
|
|||
|
|
@ -14,24 +14,28 @@ $.extend(website, {
|
|||
$(".post-list-help").html(!website.access.write ? "You do not have permission to post" : "");
|
||||
}
|
||||
},
|
||||
setup_pagination: function($btn, opts) {
|
||||
$btn.removeClass("hide");
|
||||
|
||||
$btn.on("click", function() {
|
||||
wn.call($.extend({
|
||||
btn: $btn,
|
||||
type: "GET",
|
||||
callback: function(data) {
|
||||
if(opts.prepend) {
|
||||
opts.$wrapper.prepend(data.message);
|
||||
} else {
|
||||
opts.$wrapper.append(data.message);
|
||||
setup_pagination: function() {
|
||||
var $btn = $(".btn-more")
|
||||
.removeClass("hide")
|
||||
.on("click", function() {
|
||||
wn.call({
|
||||
btn: $btn,
|
||||
type: "GET",
|
||||
args: {
|
||||
cmd: "webnotes.templates.website_group.forum.get_post_list_html",
|
||||
limit_start: $(".post").length,
|
||||
limit_length: 20,
|
||||
group: website.group,
|
||||
view: website.view,
|
||||
pathname: website.pathname
|
||||
},
|
||||
callback: function(data) {
|
||||
$(".post-list").append(data.message);
|
||||
$btn.toggleClass("hide", !(data.message && data.message.length===opts.args.limit_length));
|
||||
website.toggle_upvote();
|
||||
}
|
||||
|
||||
$btn.toggleClass("hide", !(data.message && data.message.length===opts.args.limit_length));
|
||||
}
|
||||
}, opts))
|
||||
});
|
||||
})
|
||||
});
|
||||
},
|
||||
bind_add_post: function() {
|
||||
$(".btn-post-add").on("click", website.add_post);
|
||||
|
|
@ -47,7 +51,7 @@ $.extend(website, {
|
|||
return;
|
||||
}
|
||||
|
||||
website._update_post(this, "webnotes.website.doctype.post.post.add_post");
|
||||
website._update_post(this, "webnotes.templates.website_group.post.add_post");
|
||||
},
|
||||
bind_save_post: function() {
|
||||
$(".btn-post-add").addClass("hide");
|
||||
|
|
@ -60,7 +64,7 @@ $.extend(website, {
|
|||
return;
|
||||
}
|
||||
|
||||
website._update_post(this, "webnotes.website.doctype.post.post.save_post");
|
||||
website._update_post(this, "webnotes.templates.website_group.post.save_post");
|
||||
},
|
||||
_update_post: function(btn, cmd) {
|
||||
var values = website.get_editor_values();
|
||||
|
|
@ -74,17 +78,11 @@ $.extend(website, {
|
|||
args: $.extend({
|
||||
cmd: cmd,
|
||||
group: website.group,
|
||||
post: website.post || undefined
|
||||
post: website.post || undefined,
|
||||
}, values),
|
||||
callback: function(data) {
|
||||
var url = window.location.pathname + "?view=post&name=" + data.message;
|
||||
window.location.href = url;
|
||||
|
||||
// if(history.pushState) {
|
||||
// app.get_content(url);
|
||||
// } else {
|
||||
// window.location.href = url;
|
||||
// }
|
||||
}
|
||||
});
|
||||
},
|
||||
|
|
@ -175,7 +173,7 @@ $.extend(website, {
|
|||
$post_editor.find('[data-fieldname="assigned_to"]').val(value);
|
||||
bind_close();
|
||||
},
|
||||
method: "webnotes.website.doctype.post.post.suggest_user"
|
||||
method: "webnotes.templates.website_group.post.suggest_user"
|
||||
});
|
||||
bind_close();
|
||||
}
|
||||
|
|
@ -271,7 +269,7 @@ $.extend(website, {
|
|||
}
|
||||
},
|
||||
toggle_upvote: function() {
|
||||
if(!website.access.read) {
|
||||
if(!website.access.read || !website.upvote) {
|
||||
$(".upvote").remove();
|
||||
}
|
||||
},
|
||||
|
|
@ -279,7 +277,13 @@ $.extend(website, {
|
|||
$(".post-editor").toggleClass("hide", !website.access.write);
|
||||
},
|
||||
setup_upvote: function() {
|
||||
$(".post-list, .parent-post").on("click", ".upvote a", function() {
|
||||
if(window.website.setup_upvote_done) return;
|
||||
|
||||
window.website.setup_upvote_done = true;
|
||||
|
||||
$(document).on("click", ".post-list .upvote a, .parent-post .upvote a", function() {
|
||||
console.log("clicked");
|
||||
|
||||
var sid = wn.get_cookie("sid");
|
||||
if(!sid || sid==="Guest") {
|
||||
wn.msgprint("Please login to Upvote!");
|
||||
|
|
@ -315,6 +319,8 @@ $.extend(website, {
|
|||
}).always(function() {
|
||||
$btn.prop("disabled", false);
|
||||
});
|
||||
|
||||
return false;
|
||||
});
|
||||
},
|
||||
setup_autosuggest: function(opts) {
|
||||
|
|
@ -490,7 +496,7 @@ $.extend(website, {
|
|||
profile: $tr.attr("data-profile"),
|
||||
perm: $chk.attr("data-perm"),
|
||||
value: $chk.prop("checked") ? "1" : "0",
|
||||
sitemap_page: website.group
|
||||
group: website.group
|
||||
},
|
||||
statusCode: {
|
||||
403: function() {
|
||||
|
|
@ -515,7 +521,7 @@ $.extend(website, {
|
|||
data: {
|
||||
cmd: "webnotes.templates.website_group.settings.add_sitemap_permission",
|
||||
profile: profile,
|
||||
sitemap_page: website.group
|
||||
group: website.group
|
||||
},
|
||||
success: function(data) {
|
||||
$(".add-user-control").val("");
|
||||
|
|
|
|||
|
|
@ -49,6 +49,11 @@ wn.module_page["Website"] = [
|
|||
doctype:"Blog Settings",
|
||||
route: "Form/Blog Settings"
|
||||
},
|
||||
{
|
||||
label: wn._("Website Page Permission"),
|
||||
description: wn._("Define read, write, admin permissions for a Website Page."),
|
||||
doctype:"Website Sitemap Permission",
|
||||
},
|
||||
]
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -245,10 +245,6 @@ def get_website_settings():
|
|||
context.web_include_js = hooks.web_include_js or []
|
||||
context.web_include_css = hooks.web_include_css or []
|
||||
|
||||
# get settings from site config
|
||||
if webnotes.conf.get("fb_app_id"):
|
||||
context.fb_app_id = webnotes.conf.fb_app_id
|
||||
|
||||
return context
|
||||
|
||||
def is_ajax():
|
||||
|
|
@ -330,8 +326,6 @@ class WebsiteGenerator(DocListController):
|
|||
webnotes.conn.set(self.doc, self._website_config.page_name_field, page_name)
|
||||
|
||||
def setup_generator(self):
|
||||
if webnotes.flags.in_install_app:
|
||||
return
|
||||
self._website_config = webnotes.conn.get_values("Website Sitemap Config",
|
||||
{"ref_doctype": self.doc.doctype}, "*")[0]
|
||||
|
||||
|
|
@ -351,9 +345,6 @@ class WebsiteGenerator(DocListController):
|
|||
remove_sitemap(ref_doctype=self.doc.doctype, docname=self.doc.name)
|
||||
|
||||
def update_sitemap(self):
|
||||
if webnotes.flags.in_install_app:
|
||||
return
|
||||
|
||||
self.setup_generator()
|
||||
|
||||
if self._website_config.condition_field and \
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue