GithubHelp home page GithubHelp logo

twschum / mix-mind Goto Github PK

View Code? Open in Web Editor NEW
1.0 1.0 3.0 2.21 MB

Dynamic menu generator and order manager for home bars

Home Page: https://schubar.org

License: Apache License 2.0

Python 65.34% Shell 0.11% HTML 21.93% CSS 2.28% JavaScript 10.34%

mix-mind's People

Contributors

dependabot[bot] avatar twschum avatar wmwilcox avatar

Stargazers

 avatar

Watchers

 avatar

mix-mind's Issues

Firefox adds a bullet to list items

there's a ::marker added that prepends a bullet to li tag items in Firefox but not Chrome. Seen when looking at a details page for a drink.

Traceback | 'super' object is not an iterator in util

Happens on csv upload

INFO:werkzeug:127.0.0.1 - - [09/Jan/2020 17:12:47] "POST /manage/ingredients HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask_login/utils.py", line 261, in decorated_view
    return func(*args, **kwargs)
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask_security/decorators.py", line 216, in decorated_view
    return fn(*args, **kwargs)
  File "/Users/tim/mix-mind/mixmind/views.py", line 386, in decorated_function
    return f(*args, **kwargs)
  File "/Users/tim/mix-mind/mixmind/views.py", line 487, in ingredient_stock
    replace_existing=upload_form.replace_existing.data)
  File "/Users/tim/mix-mind/mixmind/barstock.py", line 80, in load_from_csv
    for row in reader:
  File "/Users/tim/mix-mind/mixmind/util.py", line 379, in __next__
    row = next(super(UnicodeDictReader, self))
TypeError: 'super' object is not an iterator

improve "examples" display

  • find way to display examples that shows std drinks
  • reduce multiple repeats and instead summarize on available bitters

Convert to Python 3

  • there should be library support in all/most of the libraries
  • would help a lot with the unicode issues that have cropped up

Traceback | Writeerror on /

2020-03-25 21:18:49,694: Exception on / [GET]
Traceback (most recent call last):
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/sqlalchemy/engine/result.py", line 726, in _getter
    getter = self._metadata._getter
AttributeError: 'NoneType' object has no attribute '_getter'
**NO MATCH**
During handling of the above exception, another exception occurred:
**NO MATCH**
Traceback (most recent call last):
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/twschum/mix-mind/mixmind/views.py", line 131, in browse
    to_html=True, order_link=True, convert_to=current_bar.convert, condense_ingredients=current_bar.summarize)
  File "/home/twschum/mix-mind/mixmind/views.py", line 69, in recipes_from_options
    recipes, excluded = filter_recipes(mms.processed_recipes(current_bar), filter_options, union_results=bool(filter_options.search))
  File "/home/twschum/mix-mind/mixmind/configuration_management.py", line 74, in processed_recipes
    self.generate_recipes(bar)
  File "/home/twschum/mix-mind/mixmind/configuration_management.py", line 88, in generate_recipes
    for name, recipe in list(self.base_recipes.items())]
  File "/home/twschum/mix-mind/mixmind/configuration_management.py", line 88, in <listcomp>
    for name, recipe in list(self.base_recipes.items())]
  File "/home/twschum/mix-mind/mixmind/recipe.py", line 103, in generate_examples
    example_kinds = barstock.get_all_kind_combinations((i.specifier for i in ingredients))
  File "/home/twschum/mix-mind/mixmind/barstock.py", line 119, in get_all_kind_combinations
    kind_lists = [[b.Kind for b in self.slice_on_type(i)] for i in specifiers]
  File "/home/twschum/mix-mind/mixmind/barstock.py", line 119, in <listcomp>
    kind_lists = [[b.Kind for b in self.slice_on_type(i)] for i in specifiers]
  File "/home/twschum/mix-mind/mixmind/barstock.py", line 169, in slice_on_type
    return Ingredient.query.filter(filter_).all()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3161, in all
    return list(self)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/sqlalchemy/orm/loading.py", line 105, in instances
    util.raise_from_cause(err)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 383, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 129, in reraise
    raise value
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/sqlalchemy/orm/loading.py", line 65, in instances
    for query_entity in query._entities
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/sqlalchemy/orm/loading.py", line 65, in <listcomp>
    for query_entity in query._entities
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 4182, in row_processor
    polymorphic_discriminator=self._polymorphic_discriminator,
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/sqlalchemy/orm/loading.py", line 405, in _instance_processor
    getter = result._getter(col, False)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/sqlalchemy/engine/result.py", line 728, in _getter
    return self._non_result(None)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/sqlalchemy/engine/result.py", line 1170, in _non_result
    "This result object does not return rows. "
sqlalchemy.exc.ResourceClosedError: This result object does not return rows. It has been closed automatically.
2020-03-25 21:18:49,730: OSError: write error

OAuth

Add OAuth integration

Ingredient Suggestions

Apply suggestions for a given bar to see what three ingredients would make the most drinks.

  • Scan a list of the basics, add and see what makes the most new drinks

Traceback | Something with timezone

2020-01-09 18:45:33,333: Exception on /user [GET]
Traceback (most recent call last):
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask_login/utils.py", line 261, in decorated_view
    return func(*args, **kwargs)
  File "/home/twschum/mix-mind/mixmind/views.py", line 349, in user_profile
    timestamp=mms.timestamp_formatter)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/templating.py", line 135, in render_template
    context, ctx.app)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/templating.py", line 117, in _render
    rv = template.render(context)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/jinja2/asyncsupport.py", line 76, in render
    return original_render(self, *args, **kwargs)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/jinja2/environment.py", line 1008, in render
    return self.environment.handle_exception(exc_info, True)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/jinja2/environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/jinja2/_compat.py", line 37, in reraise
    raise value.with_traceback(tb)
  File "/home/twschum/mix-mind/mixmind/templates/user_profile.html", line 3, in top-level template code
    {% from "_macros.html" import show_flashed, render_field %}
  File "/home/twschum/mix-mind/mixmind/templates/form_base.html", line 2, in top-level template code
    {% extends "base.html" %}
  File "/home/twschum/mix-mind/mixmind/templates/base.html", line 147, in top-level template code
    {% block body %}
  File "/home/twschum/mix-mind/mixmind/templates/form_base.html", line 6, in block "body"
    {% block formblock %}
  File "/home/twschum/mix-mind/mixmind/templates/user_profile.html", line 75, in block "formblock"
    <td>{{ human_timediff(order.confirmed) }}</td>
  File "/home/twschum/mix-mind/mixmind/util.py", line 371, in to_human_diff
    return pendulum.instance(dt).diff_for_humans() if dt else '-'
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/datetime.py", line 743, in diff_for_humans
    other = self.now()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/datetime.py", line 76, in now
    return pendulum.now(tz)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/__init__.py", line 207, in now
    dt = _datetime.datetime.now(local_timezone())
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/__init__.py", line 59, in local_timezone
    return get_local_timezone()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/local_timezone.py", line 31, in get_local_timezone
    tz = _get_system_timezone()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/local_timezone.py", line 59, in _get_system_timezone
    return _get_unix_timezone()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/local_timezone.py", line 174, in _get_unix_timezone
    return Timezone(etctz.replace(' ', '_'))
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/timezone.py", line 30, in __init__
    tz = read(name, extend=extended)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/zoneinfo/__init__.py", line 9, in read
    return Reader(extend=extend).read_for(name)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/zoneinfo/reader.py", line 52, in read_for
    return self.read(file_path)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/zoneinfo/reader.py", line 64, in read
    return self._parse(fd)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/zoneinfo/reader.py", line 115, in _parse
    type_idx = self._parse_type_idx(fd, hdr.transitions)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/zoneinfo/reader.py", line 198, in _parse_type_idx
    buff = self._check_read(fd, n)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/zoneinfo/reader.py", line 77, in _check_read
    nbytes, fd.name, len(result) if result else 0
pendulum.tz.zoneinfo.exceptions.InvalidZoneinfoFile: Expected 0 bytes reading /home/twschum/mix-mind/venv/lib/python3.6/site-packages/pytzdata/zoneinfo/Etc/UTC, but got 0
2020-01-09 18:45:33,546: Request finalizing failed with an error while handling an error
Traceback (most recent call last):
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask_login/utils.py", line 261, in decorated_view
    return func(*args, **kwargs)
  File "/home/twschum/mix-mind/mixmind/views.py", line 349, in user_profile
    timestamp=mms.timestamp_formatter)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/templating.py", line 135, in render_template
    context, ctx.app)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/templating.py", line 117, in _render
    rv = template.render(context)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/jinja2/asyncsupport.py", line 76, in render
    return original_render(self, *args, **kwargs)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/jinja2/environment.py", line 1008, in render
    return self.environment.handle_exception(exc_info, True)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/jinja2/environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/jinja2/_compat.py", line 37, in reraise
    raise value.with_traceback(tb)
  File "/home/twschum/mix-mind/mixmind/templates/user_profile.html", line 3, in top-level template code
    {% from "_macros.html" import show_flashed, render_field %}
  File "/home/twschum/mix-mind/mixmind/templates/form_base.html", line 2, in top-level template code
    {% extends "base.html" %}
  File "/home/twschum/mix-mind/mixmind/templates/base.html", line 147, in top-level template code
    {% block body %}
  File "/home/twschum/mix-mind/mixmind/templates/form_base.html", line 6, in block "body"
    {% block formblock %}
  File "/home/twschum/mix-mind/mixmind/templates/user_profile.html", line 75, in block "formblock"
    <td>{{ human_timediff(order.confirmed) }}</td>
  File "/home/twschum/mix-mind/mixmind/util.py", line 371, in to_human_diff
    return pendulum.instance(dt).diff_for_humans() if dt else '-'
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/datetime.py", line 743, in diff_for_humans
    other = self.now()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/datetime.py", line 76, in now
    return pendulum.now(tz)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/__init__.py", line 207, in now
    dt = _datetime.datetime.now(local_timezone())
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/__init__.py", line 59, in local_timezone
    return get_local_timezone()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/local_timezone.py", line 31, in get_local_timezone
    tz = _get_system_timezone()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/local_timezone.py", line 59, in _get_system_timezone
    return _get_unix_timezone()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/local_timezone.py", line 174, in _get_unix_timezone
    return Timezone(etctz.replace(' ', '_'))
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/timezone.py", line 30, in __init__
    tz = read(name, extend=extended)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/zoneinfo/__init__.py", line 9, in read
    return Reader(extend=extend).read_for(name)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/zoneinfo/reader.py", line 52, in read_for
    return self.read(file_path)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/zoneinfo/reader.py", line 64, in read
    return self._parse(fd)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/zoneinfo/reader.py", line 115, in _parse
    type_idx = self._parse_type_idx(fd, hdr.transitions)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/zoneinfo/reader.py", line 198, in _parse_type_idx
    buff = self._check_read(fd, n)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/pendulum/tz/zoneinfo/reader.py", line 77, in _check_read
    nbytes, fd.name, len(result) if result else 0
pendulum.tz.zoneinfo.exceptions.InvalidZoneinfoFile: Expected 0 bytes reading /home/twschum/mix-mind/venv/lib/python3.6/site-packages/pytzdata/zoneinfo/Etc/UTC, but got 0
**NO MATCH**
During handling of the above exception, another exception occurred:
**NO MATCH**
Traceback (most recent call last):
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1833, in finalize_request
    response = self.process_response(response)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 2114, in process_response
    self.session_interface.save_session(self, ctx.session, response)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/sessions.py", line 375, in save_session
    val = self.get_signing_serializer(app).dumps(dict(session))
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/itsdangerous.py", line 565, in dumps
    payload = want_bytes(self.dump_payload(obj))
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/itsdangerous.py", line 847, in dump_payload
    json = super(URLSafeSerializerMixin, self).dump_payload(obj)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/itsdangerous.py", line 550, in dump_payload
    return want_bytes(self.serializer.dumps(obj))
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/json/tag.py", line 296, in dumps
    return dumps(self.tag(value), separators=(',', ':'))
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/json/__init__.py", line 179, in dumps
    rv = _json.dumps(obj, **kwargs)
  File "/usr/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/usr/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/json/__init__.py", line 81, in default
    return _json.JSONEncoder.default(self, o)
  File "/usr/lib/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'InvalidZoneinfoFile' is not JSON serializable

Stable release

Prepare a stable release

Requires

  • #12 to be minimally feature complete
  • stable database schema
  • PEP8 compliance
  • useful docstrings and restructuring
  • README with setup and use cases (example instance config)

Support user-owned and managed bars

With #15 merged, there exists backend support for multiple bars, and the tools to edit and manage ingredient.

Required features

  • Admin can manage all bars
  • User can request a bar
    • undecided whether a user can own more than one bar, starting with one per user
    • there may be "unowned" bars, that only the admin can manage
  • An "active" bar, instead on being only one, is any that can be visited
  • There will be a global active bar
    • only logged-in users may visit a bar other than the global default
    • logged-in users will have a current bar id -> current bar set to the user's bar
    • relevant admin pages allow alternate bars to be selected
  • bar settings page for owners
  • admin still selects single bar owner
  • improved ingredient stock page
    • responsive on mobile
    • csv upload
    • csv download
    • info panel
    • reworked layouts on add ingredient

Traceback | Filter options on get

2019-09-04 14:05:50,243: Exception on / [HEAD]
Traceback (most recent call last):
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/twschum/mix-mind/mixmind/views.py", line 130, in browse
    to_html=True, order_link=True, convert_to=current_bar.convert, condense_ingredients=current_bar.summarize)
  File "/home/twschum/mix-mind/mixmind/views.py", line 68, in recipes_from_options
    recipes, excluded = filter_recipes(mms.processed_recipes(current_bar), filter_options, union_results=bool(filter_options.search))
  File "/home/twschum/mix-mind/mixmind/util.py", line 60, in filter_recipes
    include_list = [i.lower() for i in filter_options.include]
TypeError: 'NoneType' object is not iterable

Order drinks

  • could make drink name clickable link that goes to an ordering page
  • submit order from there
  • order gets sent as email

Traceback | on POST /manage/ingredients

INFO:werkzeug:127.0.0.1 - - [25/Mar/2020 10:41:21] "POST /manage/ingredients HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask_login/utils.py", line 261, in decorated_view
    return func(*args, **kwargs)
  File "/Users/tim/mix-mind/venv/lib/python3.7/site-packages/flask_security/decorators.py", line 216, in decorated_view
    return fn(*args, **kwargs)
  File "/Users/tim/mix-mind/mixmind/views.py", line 386, in decorated_function
    return f(*args, **kwargs)
  File "/Users/tim/mix-mind/mixmind/views.py", line 487, in ingredient_stock
    replace_existing=upload_form.replace_existing.data)
  File "/Users/tim/mix-mind/mixmind/barstock.py", line 80, in load_from_csv
    for row in reader:
  File "/Users/tim/mix-mind/mixmind/util.py", line 379, in __next__
    row = next(super(UnicodeDictReader, self))
TypeError: 'super' object is not an iterator

Refactor page and form templates

  • Take advantage of jinja2 inheritance templating now that there is a standard look and feel.
  • Use the browse page and order page as the main templates
  • browse pages vs simple forms -limit forms width
  • dismissible message flash would be great

Admin tools!

Admin should be able to:

  • set global configs for bars
  • set the current ingredients (from file upload)
  • adjust ingredients on table
  • set recipe library
  • view all users
  • generate menus

Traceback | Duplicate ingredients should be validation error

Should check this in validation, not be a traceback for the server.

2021-05-13 15:52:31,049: Traceback (most recent call last):
2021-05-13 15:52:31,050:   File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 2446, in wsgi_app
2021-05-13 15:52:31,050:     response = self.full_dispatch_request()
2021-05-13 15:52:31,050:   File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1951, in full_dispatch_request
2021-05-13 15:52:31,050:     rv = self.handle_user_exception(e)
2021-05-13 15:52:31,050:   File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1820, in handle_user_exception
2021-05-13 15:52:31,050:     reraise(exc_type, exc_value, tb)
2021-05-13 15:52:31,051:   File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
2021-05-13 15:52:31,051:     raise value
2021-05-13 15:52:31,051:   File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1949, in full_dispatch_request
2021-05-13 15:52:31,051:     rv = self.dispatch_request()
2021-05-13 15:52:31,051:   File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1935, in dispatch_request
2021-05-13 15:52:31,052:     return self.view_functions[rule.endpoint](**req.view_args)
2021-05-13 15:52:31,052:   File "/home/twschum/mix-mind/mixmind/views.py", line 131, in browse
2021-05-13 15:52:31,052:     to_html=True, order_link=True, convert_to=current_bar.convert, condense_ingredients=current_bar.summarize)
2021-05-13 15:52:31,052:   File "/home/twschum/mix-mind/mixmind/views.py", line 69, in recipes_from_options
2021-05-13 15:52:31,052:     recipes, excluded = filter_recipes(mms.processed_recipes(current_bar), filter_options, union_results=bool(filter_options.search))
2021-05-13 15:52:31,052:   File "/home/twschum/mix-mind/mixmind/configuration_management.py", line 74, in processed_recipes
2021-05-13 15:52:31,053:     self.generate_recipes(bar)
2021-05-13 15:52:31,053:   File "/home/twschum/mix-mind/mixmind/configuration_management.py", line 88, in generate_recipes
2021-05-13 15:52:31,053:     for name, recipe in list(self.base_recipes.items())]
2021-05-13 15:52:31,053:   File "/home/twschum/mix-mind/mixmind/configuration_management.py", line 88, in <listcomp>
2021-05-13 15:52:31,053:     for name, recipe in list(self.base_recipes.items())]
2021-05-13 15:52:31,054:   File "/home/twschum/mix-mind/mixmind/recipe.py", line 114, in generate_examples
2021-05-13 15:52:31,054:     example.cost       += ingredient.get_cost(kind, barstock)
2021-05-13 15:52:31,054:   File "/home/twschum/mix-mind/mixmind/recipe.py", line 348, in get_cost
2021-05-13 15:52:31,054:     return barstock.cost_by_kind_and_volume(util.IngredientSpecifier(self.specifier.ingredient, kind), amount, self.recipe_unit)
2021-05-13 15:52:31,054:   File "/home/twschum/mix-mind/mixmind/barstock.py", line 130, in cost_by_kind_and_volume
2021-05-13 15:52:31,054:     per_unit = self.get_kind_field(ingredient, 'Cost_per_{}'.format(unit))
2021-05-13 15:52:31,055:   File "/home/twschum/mix-mind/mixmind/barstock.py", line 136, in get_kind_field
2021-05-13 15:52:31,055:     return self.get_ingredient_row(ingredient)[field]
2021-05-13 15:52:31,055:   File "/home/twschum/mix-mind/mixmind/barstock.py", line 143, in get_ingredient_row
2021-05-13 15:52:31,055:     raise ValueError('{} has multiple entries in the input data!'.format(ingredient.__repr__()))
2021-05-13 15:52:31,055: ValueError: any spirit:St. Remy V.S.O.P. has multiple entries in the input data!

Traceback | NoneType not iterable

2020-02-11 00:21:48,901: Exception on / [HEAD]
Traceback (most recent call last):
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/twschum/mix-mind/mixmind/views.py", line 130, in browse
    to_html=True, order_link=True, convert_to=current_bar.convert, condense_ingredients=current_bar.summarize)
  File "/home/twschum/mix-mind/mixmind/views.py", line 68, in recipes_from_options
    recipes, excluded = filter_recipes(mms.processed_recipes(current_bar), filter_options, union_results=bool(filter_options.search))
  File "/home/twschum/mix-mind/mixmind/util.py", line 60, in filter_recipes
    include_list = [i.lower() for i in filter_options.include]
TypeError: 'NoneType' object is not iterable

"Regulars" (friends) feature

To support growing bar usage, a bar's owner should be able to manage who is allowed to visit and order there. Those people would be "regulars" at a bar.

First pass may simply be that users can friend each other.
[ ] Searchable users page
[ ] Can make friend requests
[ ] User can see friend requests on page
[ ] Alert badges on user page icon
[ ] User pages have a "public" view available to others

Another layer is that a bar should have different visibility modes
[ ] Default bar? How to handle non-logged-in users
[ ] Any user (public to anyone logged-in)
[ ] Regulars only (bar owner's friends)
[ ] Hidden (this exists, make it more obvious)

[ ] Self-service create-your-bar
[ ] Multiple bars per user? Should be limited

Traceback | ValueError multiple entries on get_ingredient_row()

Exception on / [GET]
Traceback (most recent call last):
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/twschum/mix-mind/venv/lib/python3.6/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/twschum/mix-mind/mixmind/views.py", line 131, in browse
    to_html=True, order_link=True, convert_to=current_bar.convert, condense_ingredients=current_bar.summarize)
  File "/home/twschum/mix-mind/mixmind/views.py", line 69, in recipes_from_options
    recipes, excluded = filter_recipes(mms.processed_recipes(current_bar), filter_options, union_results=bool(filter_options.search))
  File "/home/twschum/mix-mind/mixmind/configuration_management.py", line 74, in processed_recipes
    self.generate_recipes(bar)
  File "/home/twschum/mix-mind/mixmind/configuration_management.py", line 88, in generate_recipes
    for name, recipe in list(self.base_recipes.items())]
  File "/home/twschum/mix-mind/mixmind/configuration_management.py", line 88, in <listcomp>
    for name, recipe in list(self.base_recipes.items())]
  File "/home/twschum/mix-mind/mixmind/recipe.py", line 113, in generate_examples
    example.std_drinks += ingredient.get_std_drinks(kind, barstock)
  File "/home/twschum/mix-mind/mixmind/recipe.py", line 346, in get_std_drinks
    abv = barstock.get_kind_abv(util.IngredientSpecifier(self.specifier.ingredient, kind))
  File "/home/twschum/mix-mind/mixmind/barstock.py", line 124, in get_kind_abv
    return self.get_kind_field(ingredient, 'ABV')
  File "/home/twschum/mix-mind/mixmind/barstock.py", line 136, in get_kind_field
    return self.get_ingredient_row(ingredient)[field]
  File "/home/twschum/mix-mind/mixmind/barstock.py", line 143, in get_ingredient_row
    raise ValueError('{} has multiple entries in the input data!'.format(ingredient.__repr__()))
ValueError: Scotch whisky:Laphroaig 10 CS Batch #10 has multiple entries in the input data!

Recipe Library

Need a proper recipe library interface.

  • Recipes should present the same interface as the browse page, with search and sort options as applicable
  • A recipe card can be clicked to open an edit modal
  • New recipes can be added
  • Export recipes as downloadable json

Extra:

  • Add recipe highlighting by the bar
  • Add ability for favoriting drinks by users

Global vs per bar

  • Recipes can be unique to a bar
  • Admin can edit the base recipes
  • Bar owner that edits recipes only has the edited recipes apply to their bar

Considerations

  • store recipes in a db? how to handle multiple ingredients?
  • maybe store as json blob?
    • store diffs for different bars?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.