Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. from datetime import datetime
  2. import json
  3. import traceback
  4. import aiofiles
  5. import fastapi
  6. from fastapi import Cookie, File, Form, Request, UploadFile, WebSocket, WebSocketDisconnect
  7. from fastapi.responses import FileResponse, HTMLResponse, JSONResponse, RedirectResponse, PlainTextResponse
  8. from fastapi.staticfiles import StaticFiles
  9. from fastapi.templating import Jinja2Templates
  10. from fastapi.middleware.cors import CORSMiddleware
  11. import reporthook
  12. import searchlib
  13. ################################
  14. # Core configuration
  15. ################################
  16. app = fastapi.FastAPI()
  17. origins = [
  18. 'https://prograde.gg',
  19. 'http://localhost',
  20. 'http://localhost:5000',
  21. 'http://localhost:8080',
  22. 'http://localhost:8000'
  23. ]
  24. app.add_middleware(
  25. CORSMiddleware,
  26. allow_origins=origins,
  27. allow_credentials=True,
  28. allow_methods=['*'],
  29. allow_headers=['*']
  30. )
  31. app.mount('/static', StaticFiles(directory='static'), name='static')
  32. tmplts = Jinja2Templates(directory='templates') # TODO Get the path correctly.
  33. ################################
  34. # Core configuration
  35. ################################
  36. @app.exception_handler(Exception)
  37. async def handle_exception(req: Request, exc: Exception):
  38. tb = traceback.format_exc()
  39. await reporthook.send_report(tb)
  40. return PlainTextResponse('error', status_code=500)
  41. @app.get('/')
  42. async def render_main(req: Request):
  43. raw_articles = await load_days_from_file('testresults.json')
  44. converted = convert_days_from_articles(raw_articles)
  45. num_days = calc_num_days(converted)
  46. p = {
  47. 'sb': {
  48. 'num_days': num_days,
  49. 'days': converted
  50. },
  51. 'request': req,
  52. }
  53. return tmplts.TemplateResponse('main.htm', p)
  54. ################################
  55. # Utilities
  56. ################################
  57. async def load_days_from_file(path):
  58. async with aiofiles.open(path, mode='r') as f:
  59. contents = await f.read()
  60. return json.loads(contents)
  61. def convert_days_from_articles(rarts):
  62. processed = searchlib.process_results(rarts)
  63. output = []
  64. for dstr, arts in processed.items():
  65. day = {
  66. 'date': dstr,
  67. 'links': [convert_article(a) for a in arts['pass']],
  68. 'maybe_links': [convert_article(a) for a in arts['maybe']]
  69. }
  70. if len(day['links']) > 0:
  71. output.append(day)
  72. return output
  73. def convert_article(a):
  74. return {
  75. 'url': a['url'],
  76. 'title': a['gtitle'],
  77. 'slug': a['slug'],
  78. }
  79. DATE_FORMAT = "%Y-%m-%d"
  80. def calc_num_days(dayslist):
  81. today = datetime.now()
  82. lowest = -1
  83. for d in dayslist:
  84. pd = datetime.strptime(d['date'], DATE_FORMAT)
  85. diff = today - pd
  86. ndays = diff.days
  87. if ndays < lowest or lowest == -1:
  88. lowest = ndays
  89. return lowest