diff --git a/README.md b/README.md index 5806cae..a3aae16 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ Flatisfy Flatisfy is your new companion to ease your search of a new housing :) + + **Note**: This software is under heavy development at the moment, and the database schema could change at any time. Do not consider it as being @@ -36,6 +38,9 @@ This code is not restricted to handling flats only! See the [getting started guide](doc/0.getting_started.md). If you want to give it a try quickly, you can have a look at the [Docker image](doc/2.docker.md). +Documentation for the whole app is available +[online](https://doc.phyks.me/flatisfy/). + ## Documentation @@ -91,7 +96,14 @@ explicitly mentionned otherwise. See the `CONTRIBUTING.md` file for more infos. -## Support +## API + +Your Flatisfy instance is accessible through an API. API documentation is +available +[here](https://doc.phyks.me/flatisfy/flatisfy.web.routes.html#module-flatisfy.web.routes.api). + + +## Getting help Feel free to open issues. An IRC channel is available at [irc://irc.freenode.net/flatisfy](irc://irc.freenode.net/flatisfy) as well. diff --git a/flatisfy/data_files/__init__.py b/flatisfy/data_files/__init__.py index 36e31b8..a625485 100644 --- a/flatisfy/data_files/__init__.py +++ b/flatisfy/data_files/__init__.py @@ -18,6 +18,14 @@ from flatisfy.models.public_transport import PublicTransport LOGGER = logging.getLogger(__name__) MODULE_DIR = os.path.dirname(os.path.realpath(__file__)) +TRANSPORT_DATA_FILES = { + "FR-IDF": "stops_fr-idf.txt", + "FR-NW": "stops_fr-nw.txt", + "FR-NE": "stops_fr-ne.txt", + "FR-SW": "stops_fr-sw.txt", + "FR-SE": "stops_fr-se.txt" +} + def french_postal_codes_to_quarter(postal_code): """ @@ -129,18 +137,10 @@ def _preprocess_public_transport(): :return: A list of ``PublicTransport`` objects to be inserted in database. """ - DATA_FILES = { - "FR-IDF": "stops_fr-idf.txt", - "FR-NW": "stops_fr-nw.txt", - "FR-NE": "stops_fr-ne.txt", - "FR-SW": "stops_fr-sw.txt", - "FR-SE": "stops_fr-se.txt" - } - public_transport_data = [] # Load opendata file - for area, data_file in DATA_FILES.items(): - LOGGER.info("Building from public transport data %s." % data_file) + for area, data_file in TRANSPORT_DATA_FILES.items(): + LOGGER.info("Building from public transport data %s.", data_file) try: with io.open(os.path.join(MODULE_DIR, data_file), "r", encoding='utf-8') as fh: @@ -154,7 +154,7 @@ def _preprocess_public_transport(): lng=row[4] )) except (IOError, IndexError): - LOGGER.error("Invalid raw opendata file: %s." % data_file) + LOGGER.error("Invalid raw opendata file: %s.", data_file) return [] return public_transport_data diff --git a/flatisfy/models/flat.py b/flatisfy/models/flat.py index d683429..f7d6eb0 100644 --- a/flatisfy/models/flat.py +++ b/flatisfy/models/flat.py @@ -5,10 +5,10 @@ This modules defines an SQLAlchemy ORM model for a flat. # pylint: disable=locally-disabled,invalid-name,too-few-public-methods from __future__ import absolute_import, print_function, unicode_literals -import enum import logging import arrow +import enum from sqlalchemy import ( Column, DateTime, Enum, Float, SmallInteger, String, Text @@ -109,8 +109,7 @@ class Flat(BASE): return FlatUtilities.included elif utilities == "H.C.": return FlatUtilities.excluded - else: - return FlatUtilities.unknown + return FlatUtilities.unknown @validates("status") def validate_status(self, _, status): @@ -128,7 +127,7 @@ class Flat(BASE): return self.status.default.arg @validates("notation") - def validate_status(self, _, notation): + def validate_notation(self, _, notation): """ Notation validation method """ diff --git a/flatisfy/web/routes/api.py b/flatisfy/web/routes/api.py index 6a39ffb..11e565d 100644 --- a/flatisfy/web/routes/api.py +++ b/flatisfy/web/routes/api.py @@ -17,6 +17,8 @@ import flatisfy.data from flatisfy.models import flat as flat_model from flatisfy.models.postal_code import PostalCode +FILTER_RE = re.compile(r"filter\[([A-z0-9_]+)\]") + def JSONError(error_code, error_str): """ @@ -105,7 +107,6 @@ def flats_v1(config, db): db_query = db.query(flat_model.Flat) # Handle filtering according to JSON API spec - FILTER_RE = re.compile(r"filter\[([A-z0-9_]+)\]") filters = {} for param in bottle.request.query: filter_match = FILTER_RE.match(param) @@ -124,7 +125,7 @@ def flats_v1(config, db): return { "data": flats } - except Exception as exc: + except Exception as exc: # pylint: disable= broad-except return JSONError(500, str(exc)) @@ -147,7 +148,7 @@ def flat_v1(flat_id, config, db): return { "data": _serialize_flat(flat, config) } - except Exception as exc: + except Exception as exc: # pylint: disable= broad-except return JSONError(500, str(exc)) @@ -177,8 +178,8 @@ def update_flat_v1(flat_id, config, db): try: json_body = json.load(bottle.request.body) - for k, v in json_body.items(): - setattr(flat, k, v) + for key, value in json_body.items(): + setattr(flat, key, value) except ValueError as exc: return JSONError( 400, @@ -188,7 +189,7 @@ def update_flat_v1(flat_id, config, db): return { "data": _serialize_flat(flat, config) } - except Exception as exc: + except Exception as exc: # pylint: disable= broad-except return JSONError(500, str(exc)) @@ -213,7 +214,7 @@ def time_to_places_v1(config): return { "data": places } - except Exception as exc: + except Exception as exc: # pylint: disable= broad-except return JSONError(500, str(exc)) @@ -245,7 +246,7 @@ def search_v1(db, config): return { "data": flats } - except Exception as exc: + except Exception as exc: # pylint: disable= broad-except return JSONError(500, str(exc)) @@ -284,7 +285,7 @@ def ics_feed_v1(config, db): description += '\n{}\n'.format(flat.notes) vevent.add('description').value = description - except: + except Exception: # pylint: disable= broad-except pass return cal.serialize()