Git Product home page Git Product logo

projektzapisy's Introduction

System do obsługi cyklu dydaktycznego w Instytucie Informatyki Uniwersystetu Wrocławskiego. Za pomocą tego systemu: Nauczyciele tworzą swoje propozycje nowych przedmiotów; Studenci kształtują ofertę dydaktyczną poprzez głosowanie na te propozycje; Dyrekcja Instytutu przydziela zajęcia prowadzącym; Studenci zapisują się na zajęcia; W końcu studenci oceniają swoich nauczycieli w anonimowych ankietach. System zarządza też tematami prac dyplomowych i pozwala studentom je rezerwować.

Uruchamianie

Do postawienia developerskiej wersji systemu zapisów musimy mieć zainstalowanego Vagranta oraz Virtualboxa. Klonujemy niniejsze repozytorium na nasz komputer i odpalamy z niego polecenie vagrant up. Na naszym komputerze zostanie skonfigurowana maszyna wirtualna z uruchomionym testowym serwerem, który można odwiedzić pod adresem 0.0.0.0:8000. Folder projektzapisy na naszym komputerze jest współdzielony z maszyną wirtualną (folder /vagrant), więc serwer łapie na żywo wszystkie zmiany w robione przez nas w kodzie. Więcej informacji o maszynie developerskiej można przeczytać w instrukcji.

Jeżeli zamierzasz zajmować się frontendem, warto zapoznać się też z opisem systemu plików statycznych.

Architektura systemu

System Zapisów jest podzielony na moduły (zwane aplikacjami). Każda aplikacja definiuje swoje własne typy danych (modele), którym odpowiadają automatycznie obsługiwane tabele w bazie danych. Każda aplikacja dba o swoje własne ścieżki (URL-e) i implementuje funkcje odpowiadające na zapytania HTTP (zwane widokami). Powiązania między aplikacjami są realizowane poprzez importowanie kodu z jednego modułu do drugiego oraz przez klucze obce w bazie danych. Zwięzły opis wszystkich aplikacji w naszym systemie tutaj.

Zmiany w schemacie bazy danych

Każda zmiana w modelach musi zostać odzwierciedlona w schemacie bazy danych, co Django rozwiązuje migracjami — małymi skryptami w Pythonie, które mówią, jak ma się zmienić schemat bazy danych. Migracje można automatycznie wygenerować poleceniem python zapisy/manage.py makemigrations (w maszynie wirtualnej), ale czasem trzeba je ręcznie przerobić, jeśli zmiana w modelach wymaga transformacji danych.

Maszyna produkcyjna

Proces instalacji i konfiguracji maszyny produkcyjnej jest mocno zautomatyzowany dzięki narzędziu Ansible. Instrukcje w katalogu infra/.

Zespół

Zespół Systemu Zapisów tworzą w każdym semestrze studenci uczęszczający na przedmiot Rozwój Systemu Zapisów. Lider projektu jest zarazem prowadzącym przedmiot. W naszej pracy używamy następujących narzędzi:

  • Slack — nasz główny komunikator.
  • Rollbar — raportuje o błędach (wyjątkach) pojawiających się na produkcji.
  • Travis CI — testowanie kodu.
  • New Relic — monitorowanie wydajności serwera.

Schemat pracy

  1. Gdy zaczynamy pracować nad jakimś zadaniem, tworzymy gałąź, która odgałęzia się od master-dev. W swojej własnej gałęzi możemy przepisywać historię, szczególnie jeśli ma nam to pomóc zaktualizować się w stosunku do master-dev.
  2. Po ukończeniu tworzymy Pull Requesta z bazową gałęzią master-dev. Zaznaczamy lidera projektu do code-review. PR musi być ładnie i jasno opisany — opis ten może w przyszłości pomóc komuś zrozumieć intencje stojące za zmianą w kodzie.
  3. Proces code-review, dyskusji i nanoszenia poprawek zazwyczaj składa się z więcej niż jednego etapu. Należy na niego zarezerwować z grubsza tyle czasu, co na przygotowanie PR-a.
  4. Zaakceptowane Pull Requesty będą scalane przez lidera projektu za pomocą git merge --squash. Nie musimy się zatem wstydzić rewizji (commitów) w naszej gałęzi.
  5. Co jakiś czas (około dwóch tygodni-miesiąca) robiony jest deploy na produkcję. Gałąź master przechowuje wersję produkcyjną.

projektzapisy's People

Contributors

0ctothorp avatar apamnapat avatar asiabiega avatar averethel avatar ayertienna avatar bpodrygajlo avatar dependabot[bot] avatar florczakraf avatar fpacanowski avatar gosia avatar gyarill avatar ibb avatar iochaos avatar jasiekmarc avatar kamirus avatar kostero avatar kstarzyk avatar lewymati avatar lzatorski avatar maciekjablonski avatar mhib avatar nerd911 avatar niczka avatar notechus avatar pkacprzak avatar renovate[bot] avatar swistak35 avatar threaz avatar twasilczyk avatar user-45-20 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

projektzapisy's Issues

Notification when leaving vote page

I think it might be useful to add a close-blocking notification there because it's really easy to close it when you have dozens other tabs opened and they all look the same. (Yeah, it just happened to me when I was almost ready to save 😿)

taaaabs

Listy dystrybucyjne maili

Zamiast wysyłania maili do wszystkich studentów poprzez mailto, możnaby mieć feature do dystrubucji maili, np. wysyłając na adres [email protected] wiadomość dochodzi do wszystkich zapisanych do grupy. Plus jest taki, że prowadzący nie musi za każdym razem aktualizować sobie listy maili do studentów. Drugi plus - gdybyśmy mieli listę ze wszystkimi aktywnymi studentami (aktualizowaną automatycznie) dyrekcja mogłaby wysyłać wiadomości bezpośrednio na tą listę.

Bitbucket: nie mozna sie zapisac na jeden z dwoch wykladow

Anonymous created an issue 2015-09-29
Miejsce problemu: Logika dla informatyków
Dostępne wykłady: 2
Skutki:

  1. Zapis na dowolne ćwiczenia powoduje zapisanie na wszystkie dostępne wykłady (wykłady są w tym samym czasie, w innej sali, na innym poziomie nauczania).
  2. Wypisanie z jednego wykładu powoduje wypisanie z przedmiotu

[Sale] Nieprawdziwy konflikt, gdy dni zamienione na inne

5 stycznia (czwartek) odbędą się zajęcia piątkowe (w SZ służy do tego fereol_admin/courses/changedday/)

Przy rezerwacji sali tego dnia formularz słusznie pokazuje, że sala 25 jest wolna między 12 a 14 (bo w piątki nie ma tam zajęć).

Jednak gdy klika się zapisz pojawia się informacja, że jest wtedy wykład z analizy matematycznej (wykład jest, ale w czwartki). Dni zamienione na inne nie zadziałały w tej drugiej walidacji.

Screenshot:
sz_rezerwacja_dni_zamienione_na_inne

Widok dla pojedynczego newsa

W tej chwili nie mamy widoku dla pojedynczego newsa, więc w mailu z powiadomieniem o nowym newsie wysyłamy link do wszystkich newsów. Bardziej intuicyjne byłoby wysyłanie linku do nowo dodanego newsu.

Infra roadmap

  • Read http://rogueleaderr.com/post/65157477648/the-idiomatic-guide-to-deploying-django-in
  • Make chefable environment
  • Add monitoring, for example: new relic
  • Encryption of secrets
  • Add useful tools
    • htop
  • Clean up the settings.py, make it versioned in a system
  • Add error tracking software: rollbar looks like the one which is free and supports python2.6
    • It works! It just needs an upgrade of six to 1.9.0
  • Clean directories which should be linked on production/staging systems (logs/, at least)
  • Add logs with logrotate [ logs are rotated, but not with the logrotate. Setup was annoying as fuck, it may be easier to do it right when on newer versions of Django and/or python ]
  • CircleCI setup
    • Notifications to slack
    • Github PR CI badges
  • Make deployment with switchable releases
  • Queue tools (Celery, RabbitMQ) [ I would postpone until we'll be on python >= 2.7]
  • Backups
  • NewRelic monitoring for Django application
  • Accounts
    • new relic
    • rollbar
  • Find better domain than my personal zapisyuwr.swistak35.com for staging
  • Make deploy install packages
  • Make deploy run migrations

Konta w serwisach rollbar i newrelic

Potrzebujemy tutaj założyć dwa konta, na jakiś adres e-mail systemu zapisów:

  • newrelic.com
  • rollbar.com

Aktualnie obie rzeczy robiłem na prywatnych kontach.

Courses in review were visible as courses in offer

Not accepting a course proposition would result in putting it on the offer list as normal course
compare get_proposals in zapisy/apps/enrollment/courses/models/course.py and zapisy/templates/common/coursesitebar.html (for review code is 5).

Prawa dostępu do widoków

W zeszłym semestrze były problemy z dostępem, niektórzy użytkownicy mieli dostęp do widoków, których nie powinni widzieć

Zadania:

  • Opisać sposób w jaki system sprawdza dostęp użytkownika do widoku i jesli zajedzie taka potrzeba poprawić go
  • Upewnić się, że wszystkie widoki które powinny być dostępne tylko dla pracowników są niedostępne dla studentów

Bitbucket: jednoczesny wpis w kolejce i na liscie zapisanych na wyklad

Anonymous created an issue 2016-10-04
Jako student gdy jestem zapisany do kolejki na ćwiczenia/pracownie oraz znajduję się w kolejce na wykład w momencie, gdy zwolni się miejsce na ćwiczeniach ( na wykładzie dalej znajduje się w kolejce). To automatycznie zostaję zapisany na wykład ale także nadal znajduję się na liście oczekujących co skutkuje zdublowaniem wpisu zapisani/w kolejce.
Przykład występowanie błędu: Kurs: Wybrane elementy praktyki projektowania oprogramowania (2016/17 zimowy) https://zapisy.ii.uni.wroc.pl/records/13588/records

Cleanups

To Do:

  • Remove all migrations
  • Remove all tests that are red or non-sense

Zakładka 'swapy' w aplikacji 'statystyki'

Odwiedzenie /statics/swap powoduje wykonanie sporej liczby zapytań i bład http 500. Przykład błędu:

NoReverseMatch at /statistics/swap/
Reverse for ''records-group'' with arguments '(13297,)' and keyword arguments '{}' not found.

Błędy w podglądzie edycji przedmiotu

Np. /courses/algebra_1516

(Studenci w grupach: , studenci bez grupy: )

  • zrozumieć widok course z apps/enrollment/courses/views.py
  • w miarę możliwości pozbyć się SQLa na rzecz zapytań django
  • naprawić błąd
  • przenieść większość kodu z widoku do odpowiednich metod modeli

Upgrade 1.5

Description

There are still some (known) tasks to do to complete upgrade to Django 1.5.
If you think that there's something else to do, feel free to update this issue.
Any help is welcome as well.

Tasks

  • Update url syntax in templates
  • Fix usage of static files in templates
  • Fix static files in rest of the project (o___O for example: https://github.com/lewymati/projektzapisy/blob/master/zapisy/apps/news/admin.py)
  • Update manage.py (because there's already warning about it's deprecation)
  • Figure out how to properly query if user is student or employee
  • There are some other deprecation warnings that have to be eliminated

Walidacja modeli

Prawie wszystkie modele powinny mieć przeciążone metody clean()

Wg. aplikacji:

  • enrollment/courses
  • enrollment/records
  • offer
  • schedule
  • users

Przydałoby się najpierw napisać testy.

Usunięcie relacji "teachers" z modelu Course

Moim zdaniem relacja teachers z modelu Course powinna zostać usunięta.
Ta sama informacja przechowywana jest w Group.teacher, można się do niej dostać wykonując tą samą liczbę zapytań, na tabeli o tym samym rozmiarze.

Checkboksy filtrujące przedmioty

Filtr Kursy i seminaria nie działa na K1 i K2 -- a co za tym idzie nie ukrywa/pokazuje kursów na liście.

A tak na boku, to nie wiem czy nie przydałby się jakiś rework też tych filtrów z prawej (pokaż/schowaj) -- chodzi mi o ich ujednolicenie.

Setting up staging sever

Description

Our server runs on the II's VPS. Machine has whole environment setup in bare-bone style. It needs some more attention.

Right now everything runs on unattached server process running on the machine. It is not really secure and requires work on automating deploys.

Good thing to think about - do we really need to automate this process? I am not that sure... IMO, just git pulling by hand is enough.

Run server

  1. Enter [email protected]
  2. Get into var/lib/projektzapisy/zapisy and run nohup python manage.py runserver 0.0.0.0:8000 &
  3. Immediately leave terminal session. Sometimes control may get back to your user

TO DO

Server infrastructure

  • Automate running Django process with proper env
  • Enforce Basic Auth authorization, to restrict access to whole website
  • Ensure, you cannot connect from outside the machine to postgres

CI

  • Setup Jenkins
    • Setup Testing running
    • Setup deploys after commit

Magic numbers

W projekcie jest bardzo dużo "magicznych stałych", np:

def is_proposal(self):
    return (self.status == 0) or (self.status == 5)

Powinniśmy zamienić je na stałe zdefiniowane w odpowiednich klasach.

Limity w grupach ISIM - zła nazwa

W adminie można ustawiać następujące dodatkowe limity:
Miejsca dla zamawianych 2009 Miejsca dla zamawianych 2012 Miejsca dla zamawianych 2012

Te drugie 'Miejsca dla zamawianych 2012' odpowiadają za ISIM. Trzeba zmienić nazwę.

Problemy z utworzeniem srodowiska

Jestem na masterze

(env2.6) vagrant@vagrant-ubuntu-trusty-64:/var/www/zapisy$ python manage.py run
server 0.0.0.0:8000
/home/vagrant/env2.6/lib/python2.6/site-packages/django/conf/__init__.py:75: Dep
recationWarning: The ADMIN_MEDIA_PREFIX setting has been removed; use STATIC_URL
 instead.
  "use STATIC_URL instead.", DeprecationWarning)
Traceback (most recent call last):
  File "manage.py", line 14, in <module>
    from django.contrib.auth.models import Permission
  File "/home/vagrant/env2.6/lib/python2.6/site-packages/django/contrib/auth/mod
els.py", line 5, in <module>
    from django.db import models
  File "/home/vagrant/env2.6/lib/python2.6/site-packages/django/db/__init__.py",
 line 11, in <module>
    if DEFAULT_DB_ALIAS not in settings.DATABASES:
  File "/home/vagrant/env2.6/lib/python2.6/site-packages/django/utils/functional
.py", line 184, in inner
    self._setup()
  File "/home/vagrant/env2.6/lib/python2.6/site-packages/django/conf/__init__.py
", line 42, in _setup
    self._wrapped = Settings(settings_module)
  File "/home/vagrant/env2.6/lib/python2.6/site-packages/django/conf/__init__.py
", line 135, in __init__
    logging_config_func(self.LOGGING)
  File "/home/vagrant/env2.6/lib/python2.6/site-packages/django/utils/dictconfig
.py", line 553, in dictConfig
    dictConfigClass(config).configure()
  File "/home/vagrant/env2.6/lib/python2.6/site-packages/django/utils/dictconfig
.py", line 352, in configure
    '%r: %s' % (name, e))
ValueError: Unable to configure handler 'logfile': [Errno 2] No such file or dir
ectory: '/vagrant/zapisy/logs/djangoproject.log'
(env2.6) vagrant@vagrant-ubuntu-trusty-64:/var/www/zapisy$

W env setup trzeba dodać:

mkdir /vagrant/zapisy/logs
touch /vagrant/zapisy/logs/djangoproject.log

Brakowało też rollbara - pomogło pip install rollbar

Cykliczne wydarzenie i konflikt z wydarzeniem z 'ł' w nazwie

Dodawanie cyklicznej rezerwacji daje 500tkę jeśli wykryty jest konflikt z wydarzeniem, które ma 'ł' w nazwie:

2016-09-27 02:44:03,117 [MainThread  ] [ERROR] [django.request      ]  Internal Server Error: /fereol_admin/schedule/specialreservation/add/
Traceback (most recent call last):
  File "/home/zapisy/env26/lib/python2.6/site-packages/django/core/handlers/base.py", line 111, in get_response
    response = callback(request, *callback_args, **callback_kwargs)
  File "/home/zapisy/env26/lib/python2.6/site-packages/newrelic-2.68.0.50/newrelic/hooks/framework_django.py", line 503, in wrapper
    return wrapped(*args, **kwargs)
  File "/home/zapisy/env26/lib/python2.6/site-packages/django/contrib/admin/options.py", line 366, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "/home/zapisy/env26/lib/python2.6/site-packages/django/utils/decorators.py", line 91, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/home/zapisy/env26/lib/python2.6/site-packages/django/views/decorators/cache.py", line 89, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "/home/zapisy/env26/lib/python2.6/site-packages/django/contrib/admin/sites.py", line 196, in inner
    return view(request, *args, **kwargs)
  File "/home/zapisy/env26/lib/python2.6/site-packages/django/utils/decorators.py", line 25, in _wrapper
    return bound_func(*args, **kwargs)
  File "/home/zapisy/env26/lib/python2.6/site-packages/django/utils/decorators.py", line 91, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/home/zapisy/env26/lib/python2.6/site-packages/django/utils/decorators.py", line 21, in bound_func
    return func(self, *args2, **kwargs2)
  File "/home/zapisy/env26/lib/python2.6/site-packages/django/db/transaction.py", line 209, in inner
    return func(*args, **kwargs)
  File "/home/zapisy/env26/lib/python2.6/site-packages/django/contrib/admin/options.py", line 937, in add_view
    if form.is_valid():
  File "/home/zapisy/env26/lib/python2.6/site-packages/django/forms/forms.py", line 124, in is_valid
    return self.is_bound and not bool(self.errors)
  File "/home/zapisy/env26/lib/python2.6/site-packages/django/forms/forms.py", line 115, in _get_errors
    self.full_clean()
  File "/home/zapisy/env26/lib/python2.6/site-packages/django/forms/forms.py", line 272, in full_clean
    self._post_clean()
  File "/home/zapisy/env26/lib/python2.6/site-packages/django/forms/models.py", line 332, in _post_clean
    self.instance.clean()
  File "/home/zapisy/projektzapisy/releases/1474674344/zapisy/apps/schedule/models/specialreservation.py", line 144, in clean
    self.validate_against_event_terms()
  File "/home/zapisy/projektzapisy/releases/1474674344/zapisy/apps/schedule/models/specialreservation.py", line 123, in validate_against_event_terms
    unicode(terms[0].event) + ' ' + unicode(terms[0])]},
  File "/home/zapisy/projektzapisy/releases/1474674344/zapisy/apps/schedule/models/event.py", line 262, in __unicode__
    smart_unicode(self.description))
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in position 52: ordinal not in range(128)

bcc w [Wyślij wiadomość do grupy]

Klikając 'wyślij wiadomość do grupy' uruchamia się klient pocztowy z wpisanymi adresami jako odbiorcy.
Lepiej będzie jak odbiorcy wpiszą się automatycznie do bcc.

[Głosowanie] Korekta w adminie

W ustawieniach głosowania w panelu administratora (fereol_admin/vote/systemstate/) pole początek/koniec korekty jest niepotrzebne (duplikuje początek/koniec korekty zimowej). Trzeba to usunąć.

sz_korekta

Pracownicy nie mogą dodawać egazaminów

Ze względu na tę linię kodu pracownicy nie mogą dodawać egazminów:

qs = qs.filter(teachers=user.employee)

w apps/schedule/forms.py.

PS: podobno jest tak od zawsze

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.