Skip to content

Commit

Permalink
A lot of cleanup, few improvements here and there, new feature to reu…
Browse files Browse the repository at this point in the history
…se archived wishes
  • Loading branch information
TaaviE committed Mar 28, 2020
1 parent 3de9193 commit 5c1dd70
Show file tree
Hide file tree
Showing 12 changed files with 136 additions and 28 deletions.
10 changes: 5 additions & 5 deletions models/sql/init_db.sql
Original file line number Diff line number Diff line change
Expand Up @@ -540,18 +540,18 @@ create table archived_wishlists
received timestamp default now()
);

alter table archived_wishlists
alter table wishlists_archived
owner to jolod;

create unique index archived_wishlists_note_id_uindex
on archived_wishlists (id);
on wishlists_archived (id);

create index archived_wishlists_user_id_index
on archived_wishlists (user_id);
on wishlists_archived (user_id);

create index archived_wishlists_purchased_user_id
on archived_wishlists (purchased_by);
on wishlists_archived (purchased_by);

create index archived_wishlists_event_id
on archived_wishlists (event_id);
on wishlists_archived (event_id);

4 changes: 2 additions & 2 deletions models/sql/wishlists_trigger.sql
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ $update_wishlists$
begin
if (tg_op = 'DELETE') then
-- wishlist item was deleted
insert into "archived_wishlists" ("id", "item", "status", "purchased_by", "user_id", "event_id",
"original_creation")
insert into wishlists_archived ("id", "item", "status", "purchased_by", "user_id", "event_id",
"original_creation")
values (old."id", old."item", old."status", old."purchased_by", old."user_id", old."event_id", old."when");
return old;
elsif (tg_op = 'UPDATE') then
Expand Down
3 changes: 3 additions & 0 deletions models/users_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@


class Role(db.Model, RoleMixin):
"""
Described how roles are assigned to users
"""
__tablename__ = "roles"
id: int = Column(Integer(), server_default=FetchedValue(), primary_key=True, unique=True, nullable=False)
name: str = Column(VARCHAR(80), unique=True)
Expand Down
2 changes: 1 addition & 1 deletion models/wishlist_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class ArchivedWishlist(db.Model):
@param status: status of the item
@param purchased_by: item has been claimed by whom
"""
__tablename__ = "archived_wishlists"
__tablename__ = "wishlists_archived"

id: int = Column(BigInteger, server_default=FetchedValue(), primary_key=True, unique=True, nullable=False)
user_id: int = Column(Integer, ForeignKey(User.id), nullable=False)
Expand Down
4 changes: 3 additions & 1 deletion templates/creatething.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
<div class="mdl-card__supporting-text mdl-color-text--grey-600">
<form method="post" action="{{ endpoint }}">
<div class="mdl-textfield mdl-js-textfield">
<input name="action" type="hidden" value="{{ action }}">
{% if action %}
<input name="action" type="hidden" value="{{ action }}">
{% endif %}
{# <!--suppress HtmlFormInputWithoutLabel --> #}
{% if extra_data %}
<input name="extra_data" type="hidden" value="{{ extra_data }}">
Expand Down
6 changes: 3 additions & 3 deletions templates/table_views/notes_private.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ <h2 class="custom-white-text mdl-card__title-text">{{ _("Options") }}</h2>
</div>
<div class="mdl-card__actions mdl-card--border">
<a class="mdl-button mdl-button--colored mdl-js-button mdl-js-ripple-effect"
href="{{ url_for("edit_page.createnote") }}">{{ _("Add new") }}</a>
href="{{ url_for("edit_page.note_add") }}">{{ _("Add new") }}</a>
{% if not archived %}
<a class="mdl-button mdl-button--colored mdl-js-button mdl-js-ripple-effect"
href="{{ url_for("main_page.archived_notes") }}">{{ _("View archive") }}</a>
Expand Down Expand Up @@ -56,7 +56,7 @@ <h2 class="mdl-card__title-text">{{ _("Your wishlist") }}</h2>
<td class="custom-white-space mdl-data-table__cell--non-numeric">{{ item.item }}</td>
{% if not empty %}
<td class="mdl-data-table__cell--non-numeric">
{% if (datetime.now() - item.when).days < 60 %}
{% if item.allow_modify %}
<form method="post"
action="{{ url_for("edit_page.note_remove", request_id=item.id) }}">
<input name="action" type="hidden" value="DELETENOTE">
Expand All @@ -69,7 +69,7 @@ <h2 class="mdl-card__title-text">{{ _("Your wishlist") }}</h2>
{% endif %}
</td>
<td class="mdl-data-table__cell--non-numeric">
{% if (datetime.now() - item.when).days < 90 %}
{% if item.allow_modify %}
<a class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--accent"
href="{{ url_for("edit_page.note_edit_get", request_id=item.id) }}">{{ _("Edit") }}</a>
{% else %}
Expand Down
6 changes: 4 additions & 2 deletions templates/table_views/notes_private_archived.html
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ <h2 class="custom-white-text mdl-card__title-text">{{ _("Options") }}</h2>
</div>
<div class="mdl-card__actions mdl-card--border">
<a class="mdl-button mdl-button--colored mdl-js-button mdl-js-ripple-effect"
href="{{ url_for("edit_page.createnote") }}">{{ _("Add new") }}</a>
href="{{ url_for("edit_page.note_add") }}">{{ _("Add new") }}</a>
</div>
</div>
{% endblock %}
Expand All @@ -38,7 +38,9 @@ <h2 class="mdl-card__title-text">{{ _("Archived wishlist items") }}</h2>
{% for item, id in list.items() %}
<tr>
<td class="custom-white-space mdl-data-table__cell--non-numeric">{{ item }}</td>
<td></td>
<td><a class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--accent"
href="{{ url_for("edit_page.note_restore", note_id=id) }}">{{ _("Restore") }}</a>
</td>
</tr>
{% endfor %}
</tbody>
Expand Down
12 changes: 9 additions & 3 deletions translations/babel.cfg
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
[python: **.py]
[python: **/**.py]
[python: **/**/**.py]
[python: **/**/**/**.py]
[python: **/**/**/**/**.py]

[jinja2: **/templates/**.html]
[jinja2: **/templates/security/**.html]
[jinja2: **/templates/security/email/**.html]
[jinja2: **/templates/security/email/**.txt]
[jinja2: **/templates/**/**.html]
[jinja2: **/templates/**/**/**.html]
[jinja2: **/templates/**/**/**.txt]
[jinja2: **/templates/**/**/**/**.html]
extensions = jinja2.ext.autoescape,jinja2.ext.with_
encoding = utf-8
44 changes: 39 additions & 5 deletions views/edit/group.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

from config import Config
from main import db
from models.family_model import Group, GroupAdmin
from models.family_model import FamilyGroup, Group, GroupAdmin
from models.users_model import User
from utility_standalone import get_user_id
from views.edit.blueprint import edit_page
Expand All @@ -41,7 +41,7 @@ def group_remove_fam(group_id: str, family_id: str):
"""
Displays a page for removing a family from a group
"""
# TODO: display confirmation

try:
group_id = int(group_id)
family_id = int(family_id)
Expand All @@ -58,9 +58,43 @@ def group_remove_fam(group_id: str, family_id: str):
title=_("Error"))

return render_template("creatething.html",
row_count=1,
endpoint=url_for("edit_page.add_group_post"),
label=_("Group name"))
endpoint=url_for("edit_page.group_remove_fam_post",
family_id=family_id,
group_id=group_id),
confirm=True)


@edit_page.route("/group/<group_id>/removefamily/<family_id>", methods=["POST"])
@login_required
def group_remove_fam_post(group_id: str, family_id: str):
"""
Removes a page from a group
"""
group_id = int(group_id)
family_id = int(family_id)
user_id = get_user_id()

group_admin: GroupAdmin = GroupAdmin.query.filter(GroupAdmin.user_id == user_id).first()
if not group_admin:
return render_template("utility/error.html",
message=_("Permission denied"),
title=_("Error"))

try:
FamilyGroup.query.filter(and_(FamilyGroup.group_id == group_id,
FamilyGroup.family_id == family_id)).delete()
db.session.commit()
except Exception as e:
db.session.rollback()
logger.warning(e)
return render_template("utility/error.html",
message=_("Failed deleting family from group"),
title=_("Error"))

return render_template("utility/success.html",
action=_("Deleted"),
link=url_for("main_page.groups"),
title=_("Deleted"))


@edit_page.route("/group/add", methods=["POST"])
Expand Down
49 changes: 44 additions & 5 deletions views/edit/note.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from main import db
from models.enums import wishlist_status_to_id
from models.users_model import User
from models.wishlist_model import Wishlist
from models.wishlist_model import ArchivedWishlist, Wishlist
from utility_standalone import get_user_id
from views.edit.blueprint import edit_page

Expand All @@ -26,22 +26,22 @@

@edit_page.route("/note/add", methods=["GET"])
@login_required
def add_note():
def note_add():
"""
:return: Displays the form required to add a note
"""
return render_template("creatething.html",
action="ADD",
confirm=False,
endpoint=url_for("edit_page.add_note_post"),
endpoint=url_for("edit_page.note_add_post"),
row_count=3,
label=_("Your wish"),
placeholder="")


@edit_page.route("/note/add", methods=["POST"])
@login_required
def add_note_post():
def note_add_post():
"""
Allows submitting new notes to a wishlist
"""
Expand Down Expand Up @@ -224,7 +224,7 @@ def note_remove(request_id: str):
logger.info(f"Removed {username} note with ID {request_id}")
return render_template("utility/success.html",
action=_("Removed"),
link="/notes",
link=url_for("main_page.notes"),
title=_("Removed"))


Expand All @@ -237,6 +237,7 @@ def update_note_status(id: str):
user_id = get_user_id()

# TODO: Check if they should be able to change?

try:
requested_status = int(request.form["status"])
note = Wishlist.query.get(id)
Expand Down Expand Up @@ -272,3 +273,41 @@ def update_note_status(id: str):
back=True)

return redirect(url_for("main_page.wishlist", person_id=note.user_id), code=303)


@edit_page.route("/note/restore/<note_id>", methods=["GET"])
@login_required
def note_restore(note_id: str):
"""
@param note_id: The archived note to restore and place into the wishlist
"""
user_id = get_user_id()
note_id = int(note_id)

note: ArchivedWishlist = ArchivedWishlist.query.get(note_id)
if note.user_id != user_id:
return render_template("utility/error.html",
message=_("Could not restore"),
title=_("Error"),
back=True)

db_entry_notes = Wishlist(
user_id=note.user_id,
item=note.item
)

try:
db.session.add(db_entry_notes)
db.session.commit()
except Exception as e:
logger.debug(f"User {user_id} caused an error \"{e}\" restoring a note")
sentry_sdk.capture_exception(e)
return render_template("utility/error.html",
message=_("Could not restore"),
title=_("Error"),
back=True)

return render_template("utility/success.html",
action=_("Restored"),
link=url_for("main_page.notes"),
title=_("Restored"))
20 changes: 19 additions & 1 deletion views/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,8 @@ def family(group_id: str, family_id: str):
authorized = False
for member in requested_family.members:
if member.id == user_id:
member.self = True
# This is required to hide the display button that would show an access denied page
authorized = True
break

Expand Down Expand Up @@ -445,14 +447,30 @@ def notes():
try:
# noinspection PyComparisonWithNone
# SQLAlchemy doesn't like "is None"
db_notes = Wishlist.query.filter(Wishlist.user_id == user_id).all()
db_notes: List[Wishlist] = Wishlist.query.filter(Wishlist.user_id == user_id).all()
except Exception as e:
sentry_sdk.capture_exception(e)
raise e

if len(db_notes) <= 0:
empty = True

now = datetime.now()
for db_note in db_notes:
db_note.allow_modify = True

if now - db_note.when > timedelta(days=30):
db_note.allow_modify = False

if now - db_note.when > timedelta(days=90) and \
(db_note.status == wishlist_status_to_id["default"] or
db_note.status == wishlist_status_to_id["modified"]):
db_note.allow_modify = True

if db_note.status == wishlist_status_to_id["purchased"] or \
db_note.status == wishlist_status_to_id["booked"]:
db_note.allow_modify = False

return render_template("table_views/notes_private.html",
list=db_notes,
empty=empty,
Expand Down
4 changes: 4 additions & 0 deletions websockets.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# coding=utf-8
"""
Contains websocket related code
"""

0 comments on commit 5c1dd70

Please sign in to comment.