helpers.py
160 lines
| 4.5 KiB
| text/x-python
|
PythonLexer
r2 | # -*- coding: utf-8 -*- | |||
r112 | # Copyright 2010 - 2017 RhodeCode GmbH and the AppEnlight project authors | |||
r2 | # | |||
r112 | # Licensed under the Apache License, Version 2.0 (the "License"); | |||
# you may not use this file except in compliance with the License. | ||||
# You may obtain a copy of the License at | ||||
r2 | # | |||
r112 | # http://www.apache.org/licenses/LICENSE-2.0 | |||
r2 | # | |||
r112 | # Unless required by applicable law or agreed to in writing, software | |||
# distributed under the License is distributed on an "AS IS" BASIS, | ||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
# See the License for the specific language governing permissions and | ||||
# limitations under the License. | ||||
r2 | ||||
""" | ||||
Helper functions | ||||
""" | ||||
import copy | ||||
import datetime | ||||
from collections import namedtuple, OrderedDict | ||||
_ = lambda x: x | ||||
time_deltas = OrderedDict() | ||||
r153 | time_deltas["1m"] = { | |||
"delta": datetime.timedelta(minutes=1), | ||||
"label": "1 minute", | ||||
"minutes": 1, | ||||
} | ||||
time_deltas["5m"] = { | ||||
"delta": datetime.timedelta(minutes=5), | ||||
"label": "5 minutes", | ||||
"minutes": 5, | ||||
} | ||||
time_deltas["30m"] = { | ||||
"delta": datetime.timedelta(minutes=30), | ||||
"label": "30 minutes", | ||||
"minutes": 30, | ||||
} | ||||
time_deltas["1h"] = { | ||||
"delta": datetime.timedelta(hours=1), | ||||
"label": "60 minutes", | ||||
"minutes": 60, | ||||
} | ||||
time_deltas["4h"] = { | ||||
"delta": datetime.timedelta(hours=4), | ||||
"label": "4 hours", | ||||
"minutes": 60 * 4, | ||||
} | ||||
time_deltas["12h"] = { | ||||
"delta": datetime.timedelta(hours=12), | ||||
"label": "12 hours", | ||||
"minutes": 60 * 12, | ||||
} | ||||
time_deltas["24h"] = { | ||||
"delta": datetime.timedelta(hours=24), | ||||
"label": "24 hours", | ||||
"minutes": 60 * 24, | ||||
} | ||||
time_deltas["3d"] = { | ||||
"delta": datetime.timedelta(days=3), | ||||
"label": "3 days", | ||||
"minutes": 60 * 24 * 3, | ||||
} | ||||
time_deltas["1w"] = { | ||||
"delta": datetime.timedelta(days=7), | ||||
"label": "7 days", | ||||
"minutes": 60 * 24 * 7, | ||||
} | ||||
time_deltas["2w"] = { | ||||
"delta": datetime.timedelta(days=14), | ||||
"label": "14 days", | ||||
"minutes": 60 * 24 * 14, | ||||
} | ||||
time_deltas["1M"] = { | ||||
"delta": datetime.timedelta(days=31), | ||||
"label": "31 days", | ||||
"minutes": 60 * 24 * 31, | ||||
} | ||||
time_deltas["3M"] = { | ||||
"delta": datetime.timedelta(days=31 * 3), | ||||
"label": "3 months", | ||||
"minutes": 60 * 24 * 31 * 3, | ||||
} | ||||
time_deltas["6M"] = { | ||||
"delta": datetime.timedelta(days=31 * 6), | ||||
"label": "6 months", | ||||
"minutes": 60 * 24 * 31 * 6, | ||||
} | ||||
time_deltas["12M"] = { | ||||
"delta": datetime.timedelta(days=31 * 12), | ||||
"label": "12 months", | ||||
"minutes": 60 * 24 * 31 * 12, | ||||
} | ||||
r2 | ||||
# used in json representation | ||||
r153 | time_options = dict( | |||
[ | ||||
(k, {"label": v["label"], "minutes": v["minutes"]}) | ||||
for k, v in time_deltas.items() | ||||
] | ||||
) | ||||
FlashMsg = namedtuple("FlashMsg", ["msg", "level"]) | ||||
r2 | ||||
def get_flash(request): | ||||
messages = [] | ||||
messages.extend( | ||||
r153 | [FlashMsg(msg, "error") for msg in request.session.peek_flash("error")] | |||
) | ||||
r2 | messages.extend( | |||
r153 | [FlashMsg(msg, "warning") for msg in request.session.peek_flash("warning")] | |||
) | ||||
messages.extend([FlashMsg(msg, "notice") for msg in request.session.peek_flash()]) | ||||
r2 | return messages | |||
def clear_flash(request): | ||||
r153 | request.session.pop_flash("error") | |||
request.session.pop_flash("warning") | ||||
r2 | request.session.pop_flash() | |||
def get_type_formatted_flash(request): | ||||
r153 | return [ | |||
{"msg": message.msg, "type": message.level} for message in get_flash(request) | ||||
] | ||||
r2 | ||||
def gen_pagination_headers(request, paginator): | ||||
headers = { | ||||
r153 | "x-total-count": str(paginator.item_count), | |||
"x-current-page": str(paginator.page), | ||||
"x-items-per-page": str(paginator.items_per_page), | ||||
r2 | } | |||
params_dict = request.GET.dict_of_lists() | ||||
last_page_params = copy.deepcopy(params_dict) | ||||
r153 | last_page_params["page"] = paginator.last_page or 1 | |||
r2 | first_page_params = copy.deepcopy(params_dict) | |||
r153 | first_page_params.pop("page", None) | |||
r2 | next_page_params = copy.deepcopy(params_dict) | |||
r153 | next_page_params["page"] = paginator.next_page or paginator.last_page or 1 | |||
r2 | prev_page_params = copy.deepcopy(params_dict) | |||
r153 | prev_page_params["page"] = paginator.previous_page or 1 | |||
r2 | lp_url = request.current_route_url(_query=last_page_params) | |||
fp_url = request.current_route_url(_query=first_page_params) | ||||
r153 | links = ['rel="last", <{}>'.format(lp_url), 'rel="first", <{}>'.format(fp_url)] | |||
r2 | if first_page_params != prev_page_params: | |||
prev_url = request.current_route_url(_query=prev_page_params) | ||||
links.append('rel="prev", <{}>'.format(prev_url)) | ||||
if last_page_params != next_page_params: | ||||
next_url = request.current_route_url(_query=next_page_params) | ||||
links.append('rel="next", <{}>'.format(next_url)) | ||||
r153 | headers["link"] = "; ".join(links) | |||
r2 | return headers | |||