Code Monkey home page Code Monkey logo

cherrydoor's Introduction

python tests Maintainability HitCount

cherrydoor

Prosta webaplikacja do zarządzania i przeglądania statystyk wykorzystania zamka RFID korzystająca z Flaska i MongoDB.

Instalacja i uruchamianie:

  1. Zaintaluj Cherrydoor korzystając z pip i pypi:
pip3 install Cherrydoor

Albo pobierz wheel danego wydania i zainstaluj:

pip3 install ./Cherrydoor-<version>-py3-none-any.whl
  1. Doinstaluj dodatkowe zależności i skonfiguruj trochę rzeczy korzystając z wbudowanego skryptu instalacyjnego:
cherrydoor install
  1. Program powinien być już uruchomiony przez systemd na porcie 5000. Możesz go restartować/zatrzymywać/itp. korzystając z systemctl --user <komenda> cherrydoor. Jeśli chcesz go uruchomić bez korzystania z usługi, skorzystaj ze skryptu cherrydoor start.

cherrydoor's People

Contributors

dependabot-preview[bot] avatar dependabot[bot] avatar imgbotapp avatar oplik0 avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

szypkibill

cherrydoor's Issues

Konfigurowalne opóźnienie przed otworzeniem drzwi

Czasami czekanie dłużej poprawia doświadczenie użytkownika.

Można by długo rozważać dlaczego i w jakich kontekstach, ale największe tl;dr to "gdy coś się dzieje natychmiastowo, wydaje się proste" - co w przypadku np. zabezpieczeń może zmniejszać zaufanie do produktu.

Ale cóż, to czy i jakie opóźnienie dodać łatwiej sprawdzać w produkcji - dlatego idealnie powinna być to konfigurowalna funkcja.

create and use a new door status command

Currently cherrydoor-hardware has a ping command, however - it's not giving back door status.
Ideally there would be a status command used instead of ping to both confirm that the link is alive and pass the current status of the lock.

Refactor frontendu

Obecnie najlepsze co mogę powiedzieć o samej stronie to to, że działa.

Tak jak serwer, front-end powstał na podstawie innego mojego niedokończonego i nieopublikowanego projektu który miał inne założenia, a i tak miał drobny chaos choćby jeśli chodzi o formularze. Przykładem tu może być formularz logowania wykorzystujący jako jedyny na stronie WTForms.

Serio - WTForms nie jest nigdzie indziej wykrozystywane.

JS jest drobnym chaosem, wynikającym z tego, że chciałem podzielić na pliki coś, co powinno być jednym skryptem i przez to chyba może się coś zepsuć jeśli się załaduje skrypty w złej kolejności lub nie daj boże przed załadowaniem strony.

Wykorzystuję jQuery, bootstrapa, dodatkowy styl do bootstrapa który ostatecznie niewiele zmienia, chart.js, skrypt i styl do wybierania godziny, moment.js i kilka innych rzeczy, które niekoniecznie są zupełnie potrzebne. Szczególnie chciałbym wywalić jQuery i bootstrapa, ale połowa reszty od nich zależy, więc nie mogę tego zrobić bez pełnego przepisania wszystkiego.

Myślę też nad wykrozystaniem jakiegoś frameworku typu Svelte lub Vue zamiast polegania na templateach Jinja2...

Przejście na aiohttp

Tbh. Flask trochę przeszkadza reszcie aplikacji. Muszę obchodzić to, że serwer zupełnie blokuje wątek tworząc pełen osobny proces tylko na serial.

To znacznie komplikuje architekturę programu, i wymaga uruchomienia pełnych osobnych procesów na komunikację po serialu i na serwer.

Serial już został przekonwertowany na asyncio w c4998de, co już tworzy dobrą podstawę by serwer także zmienić tak by korzystał z asyncio.

Flask jednak to niezbyt wspiera... Na szczeście istnieje aiohttp. Jest proste, działa dobrze z asyncio (pod to powstało :V) i co ważne ma biblioteki zastępujące wszystko z czego korzystam do Flaska.

"A co z moimi wątkami!" - w zasadzie będzie lepiej.

Asyncio opiera się na event loopie, więc jest to dalej jeden wątek, tylko dobrze zarządzany. Jednak event loop ma tę wadę, że jeśli pojedyncze zadanie zajmuje zbyt długo, to blokuje całą pętlę.

Dlatego też asyncio ma nawet kilka sposobów na uruchamianie zadań w osobnym wątku. Polecanym sposobem na blokujący kod jest loop.run_in_executor korzystające z concurrent.futures. Co jest lepszym rozwiązaniem niż trzymanie procesu tylko na Flaska i nie wychodzenie z niego już specjalnie dalej poza to co biblioteki robią czasami w tle (np. pymongo).

Dodatkowo aiohttp jest we wszystkim poza najprostszymi zadaniami (szczególnie w rzeczach wymagających jakiegokolwiek I/O) znacznie szybsze od Flaska. Kilka benchmarków:

Najlepiej wydajność podsumowuje chyba wykres z ostatniego linku:
aiohttp vs flask graph

I tak, wydajność w I/O jest ważna, bo w zasadzie aplikacja istnieje jako interfejs do bazy danych i połączenia z arduino po serialu.

Więc TL;DR - przejście na aiohttp uprości architekturę aplikacji (brak konieczności tworzenia dwóch wątkówi dwóch instancji pymongo/motor przy starcie), ułtawi interakcję webapliakcji z serialem, poprawi wydajność i da okazję do naprawienia różnych błędów popełnionych przy tworzeniu wersji na Flaska - w tym też okazję do zajęcia się #47

Poprawić github actions

Wygląda na to, że akcja od Black się zupełnie zepsuła. Dodatkowo obecna akcja do publikowania jest przekomplilkowana. Najpewniej więc napiszę je od nowa :V

Add some form of SSO

It'd be simpler to manage if it connected with other services I guess. School MS365 perhaps? Or Discord? Auth0?

Docstringi i komentarze w wersji na aiohttp

Jedno co cierpi na przejściu to dokumentacja w kodzie - idealnie każda metoda i klasa miała by przynajmniej krótki docstring, a w dziwniejszych miejscach kodu pojawił by się komentarz wyjaśniający powody dla których kod został w ten sposób napisany.

Testy

Idealnie powinno być 100% coverage przez pytest.
Obecnie jest 0%

Nie wymagaj uprawnień roota do instalacji

Podnoszenie uprawnień w Pythonie jest, cóż, niezbyt dobrym doświadczeniem dla użytkownika. Szczególnie gdy jest mowa o modułach instalowanych przez pip - bo wtedy trzeba instalować je dwukrotnie, w tym korzystać z bardzo niepolecanego sudo pip install, przez co trzeba śledzić i aktualizować dwie wersje programu...
Idealnie użytkownik powinien być w stanie instalować wszystko z uprawnieniami tylko do swojego folderu domowego, wykorzystując foldery ze specyfikacji XDG i systemctl --user zamiat sudo systemctl

Implementacja porządnych logów

Python ma wbudowaną bibliotekę do logowania zdarzeń z obsługą wielu poziomów logów, więc przydało by się z niej skorzystać

Zmiana struktury kodu

Obecnie wygląda to jakoś tak:

├── cherrydoor
│       ├── cli
│       │       ├── __init__.py (entry point komend)
│       │       ├── install.py
│       ├── server
│       │       ├── __init__.py
│       │       ├── routes.py
│       │       ├── api.py
│       │       ├── websockets.py
│       ├── interface
│       │       ├── __init__.py
│       │       ├── serial.py
│       ├── __init__.py

Problem: to są trzy moduły umieszczone w czwartym, z których każdy na start musi ładować ten sam plik konfiguracyjny (nawet instalacja ładuje go jeśli istnieje by zachować zmiany dokonane przez użytkownika), a po rozwiązaniu #48 - które korzystają po uruchomieniu z tej samej pętli asyncio i tej samej instancji motor.

Dodatkowo sam folder cli jest trochę głupi, bo do cli w modułach python ma specjalny plik __main__.py wywoływany domyślnie przez python -m <moduł>, więc to tam powinien trafić entry point.

Chciałbym więc przynajmniej trochę spłaszczyć strukturę. Być może serial zostanie w osobnym folderze, ale cli i serwer nie powinny być oddzielone w ten sposób.

Create an app?

An android app with HCE and possibly self-registration for cards (for users with required permissions) would be really useful.

Would also be an opportunity to move UI everywhere to flutter for consistency.

Rework bazy danych

Kiedy to projektowałem myślałem, że raczej używam MongoDB dość naiwnie, ale nie jest jakoś bardzo źle.
Teraz już rozumiem że w kilku miejscach obchodziłem problemy które powstały tylko dlatego że nie wiedziałem o tym, że MongoDB oferuje ich rozwiązanie.

TBH przyda się tu drobny rework i przygotowanie bazy danych - już przynajmniej stworzenie indeksów i korzystanie z agregacji zamiast wykonywania większej ilości niepotrzebnej pracy w Pythonie...

Poprawienie obsługi konfiguracji

Obecnie jest to json, którym w zasadzie poza deserializacją zajmuję się manualnie.

Nie jest to zarówno idealny format jak i sposób korzystania z niego - plik jest ładowany kilkukrotnie, a do tego nie ma żadnej walidacji.

Dodatkowo brakuje obsługi zmiany konfiguracji przez argumenty w cli albo przez zmienne środowiskowe.

Idealnie więc powinienem do tego korzystać z już istniejącego rozwiązania które pozwala poprawić wszystkie te problemy - np. [confuse](https://github.com/beetbox/confuse, pconf, czypython-configuration. Najlepszym formatem do konfiguracji byłby chyba YAML, tym bardziej że jest w zasadzie supersetem JSON, więc technicznie rzecz ujmując obecna konfiguracja dalej będzie prawidłowa.

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.