Compare commits
30 Commits
507472f6ff
...
framework/
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aa26a3675e | ||
|
|
732640cf90 | ||
|
|
a3193cb498 | ||
|
|
1c0be34ecf | ||
|
|
629c5b02bf | ||
|
|
b1f8b7a378 | ||
|
|
599d143c78 | ||
|
|
0724816c88 | ||
|
|
9eca59f80f | ||
|
|
c3ae746d83 | ||
|
|
a66da9b2d5 | ||
|
|
e9147b34cb | ||
|
|
02c2dcc9fc | ||
|
|
749574c8dc | ||
|
|
c40f101540 | ||
|
|
5958bbc24f | ||
|
|
d9c93d1182 | ||
|
|
d001d6b287 | ||
|
|
910f375c94 | ||
|
|
69b0e5b63a | ||
|
|
ec64147c6b | ||
|
|
b6cfef830a | ||
|
|
e3330ad1bd | ||
|
|
6d31b3915b | ||
|
|
e18bf1899e | ||
|
|
9fc58a992e | ||
|
|
6013ff7cc8 | ||
|
|
d1051be74b | ||
|
|
9ff6c99615 | ||
|
|
bbf1ffa445 |
8
.flake8
Normal file
8
.flake8
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[tool.black]
|
||||||
|
line-length = 88
|
||||||
|
target-version = ['py312']
|
||||||
|
|
||||||
|
[tool.flake8]
|
||||||
|
max-line-length = 88
|
||||||
|
extend-ignore = "E203"
|
||||||
|
exclude = ".venv"
|
||||||
@@ -1 +0,0 @@
|
|||||||
,user,localhost,03.05.2025 20:05,file:///home/user/.config/libreoffice/4;
|
|
||||||
15
AGENTS.md
Normal file
15
AGENTS.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# AGENTS.md
|
||||||
|
|
||||||
|
## Core Workflow
|
||||||
|
|
||||||
|
- **Setup**: `make prep` (creates `.venv` and installs `requirements.txt`)
|
||||||
|
- **Build**: `make build` (runs `atom_gen.py`, `prep.py`, and `build_pages.py`)
|
||||||
|
- **Events**: Update `dogadjaji.csv` then run `make events` (updates pages and generates images via `image_poster.py`)
|
||||||
|
- **Development**: `make dev` (starts Nginx using `nginx.dev.conf`) and `make stop` to terminate.
|
||||||
|
|
||||||
|
## Technical Details
|
||||||
|
|
||||||
|
- **Environment**: Uses a local virtual environment in `.venv`. Always use `./.venv/bin/python` or ensure the venv is activated.
|
||||||
|
- **Output**: The generated website is stored in the `site/` directory.
|
||||||
|
- **Data**: Events are driven by `dogadjaji.csv`.
|
||||||
|
- **Web Server**: Uses Nginx for the development server.
|
||||||
37
Makefile
Normal file
37
Makefile
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
.PHONY: build events dev stop help prep lint format
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "Available commands:"
|
||||||
|
@echo " make prep - Create venv and install requirements"
|
||||||
|
@echo " make events - Update site from CSV (build pages + images)"
|
||||||
|
@echo " make dev - Start development server"
|
||||||
|
@echo " make stop - Stop development server"
|
||||||
|
@echo " make build - Full website build sequence"
|
||||||
|
@echo " make help - Show this help message"
|
||||||
|
|
||||||
|
prep:
|
||||||
|
python3 -m venv .venv
|
||||||
|
./.venv/bin/pip install --upgrade pip
|
||||||
|
./.venv/bin/pip install -r requirements.txt
|
||||||
|
|
||||||
|
build:
|
||||||
|
./.venv/bin/python atom_gen.py
|
||||||
|
./.venv/bin/python prep.py
|
||||||
|
./.venv/bin/python build_pages.py
|
||||||
|
|
||||||
|
events:
|
||||||
|
./.venv/bin/python build_pages.py
|
||||||
|
./.venv/bin/python image_poster.py
|
||||||
|
|
||||||
|
dev:
|
||||||
|
nginx -p . -c nginx.dev.conf
|
||||||
|
|
||||||
|
stop:
|
||||||
|
nginx -p . -s stop
|
||||||
|
|
||||||
|
lint:
|
||||||
|
./.venv/bin/flake8 . --config .flake8 --exclude .venv
|
||||||
|
|
||||||
|
format:
|
||||||
|
./.venv/bin/black .
|
||||||
|
|
||||||
34
README.md
34
README.md
@@ -1,40 +1,50 @@
|
|||||||
# Decentrala
|
# Decentrala
|
||||||
|
|
||||||
dmz.rs/decentrala.org website
|
[dmz.rs](https://dmz.rs/) / [decentrala.org](https://decentrala.org) website
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
First, prepare the virtual environment and install dependencies:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
make prep
|
||||||
|
```
|
||||||
|
|
||||||
## Build site
|
## Build site
|
||||||
|
|
||||||
Run
|
To build the complete website:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
python atom_gen.py
|
make build
|
||||||
python prep.py
|
|
||||||
python build_pages.py
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Complete website will be contained in `site/`. You can copy this to server.
|
The complete website will be contained in `site/`. You can copy this to your server.
|
||||||
|
|
||||||
## Development server
|
## Development server
|
||||||
|
|
||||||
To start a development server, first build site, then run (possibly with `sudo`)
|
To start a development server, first build the site, then run (possibly with `sudo`):
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
nginx -p . -c nginx.dev.conf
|
make dev
|
||||||
```
|
```
|
||||||
|
|
||||||
To stop it:
|
To stop it:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
nginx -p . -s stop
|
make stop
|
||||||
```
|
```
|
||||||
|
|
||||||
## Events
|
## Events
|
||||||
|
|
||||||
To update events, update the `events.csv` then run commands
|
To update events, update `dogadjaji.csv` then run:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
python build_pages.py # builds html out of csv
|
make events
|
||||||
python image_poster.py # generates images for events
|
```
|
||||||
|
|
||||||
|
For checking the csv data, suggestion is the [tennis pkg](https://github.com/gurgeous/tennis), with example command:
|
||||||
|
```sh
|
||||||
|
tennis -nt --zebra --color on --theme dark --tail 20 dogadjaji.csv
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
40
atom_gen.py
40
atom_gen.py
@@ -11,7 +11,7 @@ import os
|
|||||||
|
|
||||||
blogs_dir = os.fsencode("blog")
|
blogs_dir = os.fsencode("blog")
|
||||||
|
|
||||||
#def blogposts_list_gen():
|
# def blogposts_list_gen():
|
||||||
# output_list = []
|
# output_list = []
|
||||||
# for file in os.listdir(blogs_dir):
|
# for file in os.listdir(blogs_dir):
|
||||||
# filename = os.fsdecode(file)
|
# filename = os.fsdecode(file)
|
||||||
@@ -26,46 +26,48 @@ blogs_dir = os.fsencode("blog")
|
|||||||
# output_list.append([author, title, time, content_html, full_path])
|
# output_list.append([author, title, time, content_html, full_path])
|
||||||
# return output_list
|
# return output_list
|
||||||
|
|
||||||
|
|
||||||
def events_list_gen():
|
def events_list_gen():
|
||||||
output_list = []
|
output_list = []
|
||||||
events_file = open("dogadjaji.csv", "r")
|
events_file = open("dogadjaji.csv", "r")
|
||||||
for line in events_file.readlines():
|
for line in events_file.readlines():
|
||||||
date, time, location, title = line.split(", ")
|
date, time, location, title = line.split(", ")
|
||||||
author = "Decentrala"
|
author = "Decentrala"
|
||||||
content_html = f"Event is taking place at {location} on {date} at {time}. For more information see the forum at https://forum.dmz.rs"
|
content_html = f"Event is taking place at {location} on {date} at {time}. For more information see the forum at https://forum.dmz.rs"
|
||||||
|
|
||||||
output_list.append([author, title, content_html])
|
output_list.append([author, title, content_html])
|
||||||
events_file.close()
|
events_file.close()
|
||||||
return output_list
|
return output_list
|
||||||
|
|
||||||
|
|
||||||
def feedgen(blogs, events):
|
def feedgen(blogs, events):
|
||||||
fg_blog = FeedGenerator()
|
fg_blog = FeedGenerator()
|
||||||
fg_blog.id('http://dmz.rs/')
|
fg_blog.id("http://dmz.rs/")
|
||||||
fg_blog.title('Decentrala Blog')
|
fg_blog.title("Decentrala Blog")
|
||||||
fg_blog.author( {'name':'Decentrala','email':'dmz@dmz.rs'} )
|
fg_blog.author({"name": "Decentrala", "email": "dmz@dmz.rs"})
|
||||||
fg_blog.link( href='https://dmz.rs/atom_blog.xml', rel='self' )
|
fg_blog.link(href="https://dmz.rs/atom_blog.xml", rel="self")
|
||||||
|
|
||||||
fg_events = FeedGenerator()
|
fg_events = FeedGenerator()
|
||||||
fg_events.id('http://dmz.rs/')
|
fg_events.id("http://dmz.rs/")
|
||||||
fg_events.title('Decentrala Blog')
|
fg_events.title("Decentrala Blog")
|
||||||
fg_events.author( {'name':'Decentrala','email':'dmz@dmz.rs'} )
|
fg_events.author({"name": "Decentrala", "email": "dmz@dmz.rs"})
|
||||||
fg_events.link( href='https://dmz.rs/atom_events.xml', rel='self' )
|
fg_events.link(href="https://dmz.rs/atom_events.xml", rel="self")
|
||||||
|
|
||||||
for post in blogs:
|
for post in blogs:
|
||||||
fe_blogs = fg_blog.add_entry()
|
fe_blogs = fg_blog.add_entry()
|
||||||
fe_blogs.id("https://dmz.rs/" + post[4][:-3] + ".html")
|
fe_blogs.id("https://dmz.rs/" + post[4][:-3] + ".html")
|
||||||
fe_blogs.author({'name': post[0]})
|
fe_blogs.author({"name": post[0]})
|
||||||
fe_blogs.title(post[1])
|
fe_blogs.title(post[1])
|
||||||
fe_blogs.updated(post[2])
|
fe_blogs.updated(post[2])
|
||||||
fe_blogs.content(content=post[3], type='html')
|
fe_blogs.content(content=post[3], type="html")
|
||||||
|
|
||||||
for event in events:
|
for event in events:
|
||||||
fe_events = fg_events.add_entry()
|
fe_events = fg_events.add_entry()
|
||||||
fe_events.id("https://dmz.rs/pages/events.html")
|
fe_events.id("https://dmz.rs/pages/events.html")
|
||||||
fe_events.author({'name': event[0]})
|
fe_events.author({"name": event[0]})
|
||||||
fe_events.title(event[1])
|
fe_events.title(event[1])
|
||||||
fe_events.updated(datetime.datetime.now(datetime.timezone.utc))
|
fe_events.updated(datetime.datetime.now(datetime.timezone.utc))
|
||||||
fe_events.content(content=event[2], type='html')
|
fe_events.content(content=event[2], type="html")
|
||||||
|
|
||||||
fg_blog.atom_file('site/atom_blog.xml')
|
fg_blog.atom_file("site/atom_blog.xml")
|
||||||
fg_events.atom_file('site/atom_events.xml')
|
fg_events.atom_file("site/atom_events.xml")
|
||||||
|
|||||||
4
blog.py
4
blog.py
@@ -5,8 +5,8 @@ from markdown import markdown as to_markdown
|
|||||||
|
|
||||||
blog = ""
|
blog = ""
|
||||||
|
|
||||||
with open('blogs/Lorem Ipsum.md','rt') as file:
|
with open("blogs/Lorem Ipsum.md", "rt") as file:
|
||||||
blog = file.read()
|
blog = file.read()
|
||||||
|
|
||||||
with open('blogs/Lorem Ipsum.html', 'wt') as file:
|
with open("blogs/Lorem Ipsum.html", "wt") as file:
|
||||||
file.write(to_markdown(blog))
|
file.write(to_markdown(blog))
|
||||||
|
|||||||
117
build_pages.py
117
build_pages.py
@@ -1,47 +1,88 @@
|
|||||||
#! /usr/bin/env python3
|
from jinja2 import Environment, FileSystemLoader
|
||||||
import os
|
import os
|
||||||
|
|
||||||
PAGES = [
|
PAGES = [
|
||||||
{'name': 'index', 'titleSR': 'Početna', 'titleEN': 'Home', 'style': 'home'},
|
{"name": "index", "titleSR": "Početna", "titleEN": "Home", "style": "home"},
|
||||||
{'name': 'account', 'titleSR': 'Nalog', 'titleEN': 'Account', 'style': 'account'},
|
{"name": "account", "titleSR": "Nalog", "titleEN": "Account", "style": "account"},
|
||||||
{'name': 'about', 'titleSR': 'O nama', 'titleEN': 'About us', 'style': 'about'},
|
{"name": "about", "titleSR": "O nama", "titleEN": "About us", "style": "about"},
|
||||||
{'name': 'statute', 'titleSR': 'Statut', 'titleEN': 'Statute', 'style': 'statute'},
|
{"name": "statute", "titleSR": "Statut", "titleEN": "Statute", "style": "statute"},
|
||||||
{'name': 'events', 'titleSR': 'Događaji', 'titleEN': 'Events', 'style': 'events'},
|
{"name": "events", "titleSR": "Događaji", "titleEN": "Events", "style": "events"},
|
||||||
{'name': 'events_archive', 'titleSR': 'Arhiva događaja', 'titleEN': 'Events archive', 'style': 'events'},
|
{
|
||||||
{'name': 'services', 'titleSR': 'Servisi', 'titleEN': 'Services', 'style': 'services'},
|
"name": "events_archive",
|
||||||
{'name': 'webring', 'titleSR': 'Webring', 'titleEN': 'Webring', 'style': ''},
|
"titleSR": "Arhiva događaja",
|
||||||
{'name': 'support', 'titleSR': 'Podrška', 'titleEN': 'Support', 'style': 'support'},
|
"titleEN": "Events archive",
|
||||||
{'name': 'deconference', 'titleSR': 'Dekonferencija', 'titleEN': 'Deconference', 'style': 'deconference'},
|
"style": "events",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "services",
|
||||||
|
"titleSR": "Servisi",
|
||||||
|
"titleEN": "Services",
|
||||||
|
"style": "services",
|
||||||
|
},
|
||||||
|
{"name": "webring", "titleSR": "Webring", "titleEN": "Webring", "style": ""},
|
||||||
|
{"name": "support", "titleSR": "Podrška", "titleEN": "Support", "style": "support"},
|
||||||
|
{
|
||||||
|
"name": "deconference",
|
||||||
|
"titleSR": "Dekonferencija",
|
||||||
|
"titleEN": "Deconference",
|
||||||
|
"style": "deconference",
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
def buildPage(filename: str, pageTitle: str, pageHtml: str, pageStyle: str, template: str) -> str:
|
env = Environment(loader=FileSystemLoader("template"))
|
||||||
template = template.replace('<!--TITLE-->', pageTitle)
|
|
||||||
style = '' if not pageStyle else f'<link rel=\"stylesheet\" href=\"/styles/{pageStyle}.css\">'
|
|
||||||
template = template.replace('<!--ADDITIONAL_STYLE-->', style)
|
|
||||||
template = template.replace('PAGE_NAME', filename)
|
|
||||||
template = template.replace('<!--MAIN-->', pageHtml)
|
|
||||||
return template
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
os.makedirs('site/en/', exist_ok=True)
|
os.makedirs("site/en/", exist_ok=True)
|
||||||
with open('template/page-en.html') as fTempEN, open('template/page-sr.html') as fTempSR:
|
for page in PAGES:
|
||||||
templateSR = fTempSR.read()
|
# Build SR Page
|
||||||
templateEN = fTempEN.read()
|
with open(f'pages/sr/{page["name"]}.html') as f:
|
||||||
for page in PAGES:
|
page_content = "<div class='cover-wrap'><img src='/img/students_bug.jpg' alt='Studenti su nasli bug' /></div>"
|
||||||
with open(f'pages/sr/{page["name"]}.html') as f:
|
page_content += f.read()
|
||||||
pageHtml = "<div class='cover-wrap'><img src='/img/students_bug.jpg' alt='Studenti su nasli bug' /></div>"
|
|
||||||
pageHtml += f.read()
|
|
||||||
html = buildPage(page['name'], page['titleSR'], pageHtml, page['style'], templateSR)
|
|
||||||
f = open(f'site/{page["name"]}.html', 'w')
|
|
||||||
f.write(html)
|
|
||||||
f.close()
|
|
||||||
with open(f'pages/en/{page["name"]}.html') as f:
|
|
||||||
pageHtml = "<div><img src='/img/students_bug.jpg' alt='Students found the bug' /></div>"
|
|
||||||
pageHtml += f.read()
|
|
||||||
html = buildPage(page['name'], page['titleEN'], pageHtml, page['style'], templateEN)
|
|
||||||
f = open(f'site/en/{page["name"]}.html', 'w')
|
|
||||||
f.write(html)
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
sr_html = env.get_template("page-sr.html").render(
|
||||||
|
title=page["titleSR"],
|
||||||
|
content=page_content,
|
||||||
|
extra_styles=(
|
||||||
|
f'<link rel="stylesheet" href="/styles/{page["style"]}.css">'
|
||||||
|
if page["style"]
|
||||||
|
else ""
|
||||||
|
),
|
||||||
|
lang="sr",
|
||||||
|
sr_link=f"/en/{page['name']}",
|
||||||
|
current_path=f"/{page['name']}" if page["name"] != "index" else "/",
|
||||||
|
)
|
||||||
|
|
||||||
|
sr_filename = (
|
||||||
|
"index.html" if page["name"] == "index" else f"{page['name']}.html"
|
||||||
|
)
|
||||||
|
with open(f"site/{sr_filename}", "w") as f:
|
||||||
|
f.write(sr_html)
|
||||||
|
|
||||||
|
# Build EN Page
|
||||||
|
with open(f'pages/en/{page["name"]}.html') as f:
|
||||||
|
page_content = "<div class='cover-wrap'><img src='/img/students_bug.jpg' alt='Students found the bug' /></div>"
|
||||||
|
page_content += f.read()
|
||||||
|
|
||||||
|
en_html = env.get_template("page-en.html").render(
|
||||||
|
title=page["titleEN"],
|
||||||
|
content=page_content,
|
||||||
|
extra_styles=(
|
||||||
|
f'<link rel="stylesheet" href="/styles/{page["style"]}.css">'
|
||||||
|
if page["style"]
|
||||||
|
else ""
|
||||||
|
),
|
||||||
|
lang="en",
|
||||||
|
sr_link=f"/{page['name']}",
|
||||||
|
current_path=f"/en/{page['name']}" if page["name"] != "index" else "/en/",
|
||||||
|
)
|
||||||
|
|
||||||
|
en_filename = (
|
||||||
|
"index.html" if page["name"] == "index" else f"{page['name']}.html"
|
||||||
|
)
|
||||||
|
with open(f"site/en/{en_filename}", "w") as f:
|
||||||
|
f.write(en_html)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
datum, vreme, lokacija, tema, tip, link, temaE
|
datum, vreme, lokacija, tema, tip, link, temaEN
|
||||||
20-12-2022, 19:00, DC Krov https://www.openstreetmap.org/node/10594728522, Uvod u računarske mreže,,,
|
20-12-2022, 19:00, DC Krov https://www.openstreetmap.org/node/10594728522, Uvod u računarske mreže,,,
|
||||||
03-01-2023, 19:00, DC Krov https://www.openstreetmap.org/node/10594728522, Hackathon žurka, hack,,
|
03-01-2023, 19:00, DC Krov https://www.openstreetmap.org/node/10594728522, Hackathon žurka, hack,,
|
||||||
16-01-2023, 19:00, DC Krov https://www.openstreetmap.org/node/10594728522, Privatnost na internetu, workshop,,
|
16-01-2023, 19:00, DC Krov https://www.openstreetmap.org/node/10594728522, Privatnost na internetu, workshop,,
|
||||||
|
|||||||
|
103
image_poster.py
103
image_poster.py
@@ -13,10 +13,34 @@ NEXT_MONTH = CURRENT_TIME + relativedelta.relativedelta(months=1, day=1)
|
|||||||
DAYS_OF_WEEK_SR = ("PON", "UTO", "SRE", "ČET", "PET", "SUB", "NED")
|
DAYS_OF_WEEK_SR = ("PON", "UTO", "SRE", "ČET", "PET", "SUB", "NED")
|
||||||
DAYS_OF_WEEK_EN = ("MON", "TUE", "WED", "THU", "FRI", "SAT", "SUn")
|
DAYS_OF_WEEK_EN = ("MON", "TUE", "WED", "THU", "FRI", "SAT", "SUn")
|
||||||
|
|
||||||
MONTHS_SR = ("Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul",
|
MONTHS_SR = (
|
||||||
"Avgust", "Septembar", "Oktobar", "Novembar", "Decembar")
|
"Januar",
|
||||||
MONTHS_EN = ("January", "February", "March", "April", "May", "June", "July",
|
"Februar",
|
||||||
"August", "September", "October", "November", "December")
|
"Mart",
|
||||||
|
"April",
|
||||||
|
"Maj",
|
||||||
|
"Jun",
|
||||||
|
"Jul",
|
||||||
|
"Avgust",
|
||||||
|
"Septembar",
|
||||||
|
"Oktobar",
|
||||||
|
"Novembar",
|
||||||
|
"Decembar",
|
||||||
|
)
|
||||||
|
MONTHS_EN = (
|
||||||
|
"January",
|
||||||
|
"February",
|
||||||
|
"March",
|
||||||
|
"April",
|
||||||
|
"May",
|
||||||
|
"June",
|
||||||
|
"July",
|
||||||
|
"August",
|
||||||
|
"September",
|
||||||
|
"October",
|
||||||
|
"November",
|
||||||
|
"December",
|
||||||
|
)
|
||||||
|
|
||||||
HEADER_SR = "Plan za {}"
|
HEADER_SR = "Plan za {}"
|
||||||
|
|
||||||
@@ -36,10 +60,15 @@ All events are always free
|
|||||||
|
|
||||||
def parseArgs(parser):
|
def parseArgs(parser):
|
||||||
"""
|
"""
|
||||||
Parse all arguments and return the list of argument values
|
Parse all arguments and return the list of argument values
|
||||||
"""
|
"""
|
||||||
parser.add_argument("month", metavar="MM",
|
parser.add_argument(
|
||||||
help="two digit number representing the month for which to generate poster", default="empty", nargs="?")
|
"month",
|
||||||
|
metavar="MM",
|
||||||
|
help="two digit number representing the month for which to generate poster",
|
||||||
|
default="empty",
|
||||||
|
nargs="?",
|
||||||
|
)
|
||||||
return parser.parse_args()
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
@@ -51,18 +80,19 @@ def load_events(csv_path: str, month: int) -> list[dict]:
|
|||||||
next(csv_reader, None)
|
next(csv_reader, None)
|
||||||
for event in csv_reader:
|
for event in csv_reader:
|
||||||
event_date = event[0]
|
event_date = event[0]
|
||||||
event_date_parsed = dt.datetime.strptime(
|
event_date_parsed = dt.datetime.strptime(event_date, "%d-%m-%Y").date()
|
||||||
event_date, "%d-%m-%Y").date()
|
|
||||||
event_time = event[1]
|
event_time = event[1]
|
||||||
event_title = event[3]
|
event_title = event[3]
|
||||||
event_title_en = event[3]
|
event_title_en = event[3]
|
||||||
if len(event) > 6:
|
if len(event) > 6:
|
||||||
event_title_en = event[6]
|
event_title_en = event[6]
|
||||||
|
|
||||||
current_event = {"date": event_date_parsed,
|
current_event = {
|
||||||
"time": event_time,
|
"date": event_date_parsed,
|
||||||
"title": event_title.strip(),
|
"time": event_time,
|
||||||
"title_en": event_title_en.strip()}
|
"title": event_title.strip(),
|
||||||
|
"title_en": event_title_en.strip(),
|
||||||
|
}
|
||||||
if event_date_parsed >= month and event_date_parsed < monthafter:
|
if event_date_parsed >= month and event_date_parsed < monthafter:
|
||||||
events.append(current_event)
|
events.append(current_event)
|
||||||
return events
|
return events
|
||||||
@@ -71,8 +101,7 @@ def load_events(csv_path: str, month: int) -> list[dict]:
|
|||||||
def drawMesh(draw, img, fg, bg, font, W, H):
|
def drawMesh(draw, img, fg, bg, font, W, H):
|
||||||
def drawCircle(x, y):
|
def drawCircle(x, y):
|
||||||
r = 50
|
r = 50
|
||||||
draw.ellipse((x - r, y - r, x + r, y+r),
|
draw.ellipse((x - r, y - r, x + r, y + r), fill=fg, outline=(0, 0, 0), width=0)
|
||||||
fill=fg, outline=(0, 0, 0), width=0)
|
|
||||||
|
|
||||||
LCX = 415 # logo center x
|
LCX = 415 # logo center x
|
||||||
LCY = 4350 # logo center y
|
LCY = 4350 # logo center y
|
||||||
@@ -84,11 +113,15 @@ def drawMesh(draw, img, fg, bg, font, W, H):
|
|||||||
drawCircle(LCX + d, LCY)
|
drawCircle(LCX + d, LCY)
|
||||||
|
|
||||||
draw.line([(LCX - d, LCY), (LCX + d, LCY)], fill=fg, width=20, joint=None)
|
draw.line([(LCX - d, LCY), (LCX + d, LCY)], fill=fg, width=20, joint=None)
|
||||||
draw.line([(LCX, LCY), (LCX, LCY + d), (LCX + d, LCY),
|
draw.line(
|
||||||
(LCX, LCY - d)], fill=fg, width=20, joint=None)
|
[(LCX, LCY), (LCX, LCY + d), (LCX + d, LCY), (LCX, LCY - d)],
|
||||||
draw.text((LCX - 1.7*d, LCY + 1.5*d), "dmz.rs", font=font, fill=fg)
|
fill=fg,
|
||||||
|
width=20,
|
||||||
|
joint=None,
|
||||||
|
)
|
||||||
|
draw.text((LCX - 1.7 * d, LCY + 1.5 * d), "dmz.rs", font=font, fill=fg)
|
||||||
|
|
||||||
mesh_svg = svg2png(url='site/img/mesh-light.svg')
|
mesh_svg = svg2png(url="site/img/mesh-light.svg")
|
||||||
mesh_svg_bytes = io.BytesIO(mesh_svg)
|
mesh_svg_bytes = io.BytesIO(mesh_svg)
|
||||||
mesh_img = Image.open(mesh_svg_bytes)
|
mesh_img = Image.open(mesh_svg_bytes)
|
||||||
if bg == (0, 0, 0):
|
if bg == (0, 0, 0):
|
||||||
@@ -107,35 +140,32 @@ def drawMesh(draw, img, fg, bg, font, W, H):
|
|||||||
|
|
||||||
|
|
||||||
def drawPoster(events, bg, fg, month: int, en: bool):
|
def drawPoster(events, bg, fg, month: int, en: bool):
|
||||||
fontFacade = ImageFont.truetype('./site/font/Facade-Sud.woff', size=365)
|
fontFacade = ImageFont.truetype("./site/font/Facade-Sud.woff", size=365)
|
||||||
fontIosevka = ImageFont.truetype(
|
fontIosevka = ImageFont.truetype("./site/font/iosevka-regular.woff", size=200)
|
||||||
'./site/font/iosevka-regular.woff', size=200)
|
fontIosevkaSmall = ImageFont.truetype("./site/font/iosevka-regular.woff", size=150)
|
||||||
fontIosevkaSmall = ImageFont.truetype(
|
|
||||||
'./site/font/iosevka-regular.woff', size=150)
|
|
||||||
|
|
||||||
W = 3508
|
W = 3508
|
||||||
H = 4960
|
H = 4960
|
||||||
img = Image.new('RGB', (W, H), bg)
|
img = Image.new("RGB", (W, H), bg)
|
||||||
draw = ImageDraw.Draw(img)
|
draw = ImageDraw.Draw(img)
|
||||||
|
|
||||||
drawMesh(draw, img, fg, bg, fontIosevka, W, H)
|
drawMesh(draw, img, fg, bg, fontIosevka, W, H)
|
||||||
|
|
||||||
title = "DECENTRALA"
|
title = "DECENTRALA"
|
||||||
_, _, w, _ = draw.textbbox((0, 0), title, font=fontFacade)
|
_, _, w, _ = draw.textbbox((0, 0), title, font=fontFacade)
|
||||||
draw.text(((W-w)/2, 165), title, font=fontFacade, fill=fg)
|
draw.text(((W - w) / 2, 165), title, font=fontFacade, fill=fg)
|
||||||
|
|
||||||
header = HEADER_EN if en else HEADER_SR
|
header = HEADER_EN if en else HEADER_SR
|
||||||
months = MONTHS_EN if en else MONTHS_SR
|
months = MONTHS_EN if en else MONTHS_SR
|
||||||
header = header.format(months[month.month - 1])
|
header = header.format(months[month.month - 1])
|
||||||
|
|
||||||
_, _, w, _ = draw.textbbox((0, 0), header, font=fontIosevka)
|
_, _, w, _ = draw.textbbox((0, 0), header, font=fontIosevka)
|
||||||
draw.text(((W-w)/2, 560), header, font=fontIosevka, fill=fg)
|
draw.text(((W - w) / 2, 560), header, font=fontIosevka, fill=fg)
|
||||||
|
|
||||||
height = 890
|
height = 890
|
||||||
|
|
||||||
sub_header = SUBHEADER_EN if en else SUBHEADER_SR
|
sub_header = SUBHEADER_EN if en else SUBHEADER_SR
|
||||||
draw.text((165, height), sub_header,
|
draw.text((165, height), sub_header, font=fontIosevkaSmall, fill=fg)
|
||||||
font=fontIosevkaSmall, fill=fg)
|
|
||||||
height += 800
|
height += 800
|
||||||
|
|
||||||
# Write list of events to sperate text file as well
|
# Write list of events to sperate text file as well
|
||||||
@@ -167,8 +197,7 @@ def drawPoster(events, bg, fg, month: int, en: bool):
|
|||||||
|
|
||||||
def main():
|
def main():
|
||||||
# Parse arguments
|
# Parse arguments
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(description="Generate images of the poster")
|
||||||
description="Generate images of the poster")
|
|
||||||
args = parseArgs(parser)
|
args = parseArgs(parser)
|
||||||
|
|
||||||
# Set month based on user input
|
# Set month based on user input
|
||||||
@@ -176,22 +205,24 @@ def main():
|
|||||||
if args.month.isdigit():
|
if args.month.isdigit():
|
||||||
month = dt.date(CURRENT_TIME.year, int(args.month), 1)
|
month = dt.date(CURRENT_TIME.year, int(args.month), 1)
|
||||||
elif args.month != "empty":
|
elif args.month != "empty":
|
||||||
print("Month has to be specified as a number. I will use next month as the default")
|
print(
|
||||||
|
"Month has to be specified as a number. I will use next month as the default"
|
||||||
|
)
|
||||||
|
|
||||||
# Load events and draw a poseter
|
# Load events and draw a poseter
|
||||||
events = load_events("dogadjaji.csv", month)
|
events = load_events("dogadjaji.csv", month)
|
||||||
|
|
||||||
img = drawPoster(events, (0, 0, 0), (20, 250, 50), month, False)
|
img = drawPoster(events, (0, 0, 0), (20, 250, 50), month, False)
|
||||||
img.save('poster_dark.png')
|
img.save("poster_dark.png")
|
||||||
|
|
||||||
img = drawPoster(events, (255, 255, 255), (0, 0, 0), month, False)
|
img = drawPoster(events, (255, 255, 255), (0, 0, 0), month, False)
|
||||||
img.save('poster_light.png')
|
img.save("poster_light.png")
|
||||||
|
|
||||||
img = drawPoster(events, (0, 0, 0), (20, 250, 50), month, True)
|
img = drawPoster(events, (0, 0, 0), (20, 250, 50), month, True)
|
||||||
img.save('poster_dark_en.png')
|
img.save("poster_dark_en.png")
|
||||||
|
|
||||||
img = drawPoster(events, (255, 255, 255), (0, 0, 0), month, True)
|
img = drawPoster(events, (255, 255, 255), (0, 0, 0), month, True)
|
||||||
img.save('poster_light_en.png')
|
img.save("poster_light_en.png")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -1,12 +1,17 @@
|
|||||||
<h1>About us</h1>
|
<h1>About us</h1>
|
||||||
<dl>
|
<dl>
|
||||||
<dt>Statute:</dt>
|
<dt>Statute:</dt>
|
||||||
<dd> We make decisions by direct democracy. Our statute can be found at <a href="/en/statute"> statute page</a></dd>
|
<dd>
|
||||||
|
We make decisions by direct democracy. Our statute can be found at
|
||||||
|
<a href="/en/statute"> statute page</a>
|
||||||
|
</dd>
|
||||||
|
|
||||||
<dt>Contact:</dt>
|
<dt>Contact:</dt>
|
||||||
<dd>
|
<dd>
|
||||||
You can send mail to <a href="mailto:dmz@dmz.rs">dmz@dmz.rs</a> or you can register on <a href="https://forum.dmz.rs">our Forum</a>.
|
You can send mail to <a href="mailto:dmz@dmz.rs">dmz@dmz.rs</a> or you can
|
||||||
Also, we are available on the <a href="https://balkan.fedive.rs/@decentrala">Fediverse!</a>
|
register on <a href="https://forum.dmz.rs">our Forum</a>. Also, we are
|
||||||
|
available on the
|
||||||
|
<a href="https://balkan.fedive.rs/@decentrala">Fediverse!</a>
|
||||||
If you find a bug on the site, please do tell us. We would be very grateful.
|
If you find a bug on the site, please do tell us. We would be very grateful.
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|||||||
@@ -1,8 +1,26 @@
|
|||||||
<h1>Account</h1>
|
<h1>Account</h1>
|
||||||
<p>If you have created an account on dmz.rs, you can use our XMPP and e-mail server, as well as other services that support LDAP login.<p>
|
<p>
|
||||||
<p>For more on XMPP see <a href="https://wiki.dmz.rs/en/tutorial/conversations">this tutorial</a>. <p>
|
If you have created an account on dmz.rs, you can use our XMPP and e-mail
|
||||||
<p>You can see settings for the <a href="https://www.thunderbird.net">Thunderbird</a> mail client on this <a href="/img/mailsettings.png">image</a>.<p>
|
server, as well as other services that support LDAP login.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For more on XMPP see
|
||||||
|
<a href="https://wiki.dmz.rs/en/tutorial/conversations">this tutorial</a>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
You can see settings for the
|
||||||
|
<a href="https://www.thunderbird.net">Thunderbird</a> mail client on this
|
||||||
|
<a href="/img/mailsettings.png">image</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p><a href="/account/register/">Register</a><p>
|
<div class="auth-wrap">
|
||||||
<p><a href="/account/unregister/">Delete account</a><p>
|
<p>
|
||||||
<p><a href="/account/changepassword/">Change password</a><p>
|
<a href="/account/register/">Register</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="/account/unregister/">Delete account</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="/account/changepassword/">Change password</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
Ova stranica je trenutno u izradi...
|
Ova stranica je trenutno u izradi...
|
||||||
|
|
||||||
|
|||||||
@@ -1,34 +1,95 @@
|
|||||||
<h1>Deconference</h1>
|
<h1>Deconference</h1>
|
||||||
|
|
||||||
<h2 id="program"><a href="#program">Program</a></h2>
|
<h2 id="program"><a href="#program">Program</a></h2>
|
||||||
<p>11:00 Otvaranje<p>
|
<p>11:00 Otvaranje</p>
|
||||||
<p>12:00 <a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/cryptoparty">Cryptoparty</a><p>
|
<p></p>
|
||||||
<p>14:00 <a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/hakaton">Hakaton</a><p>
|
<p>
|
||||||
<p>16:00 <a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/lightningtalks">Lightning talks</a><p>
|
12:00
|
||||||
<p>18:00 Diskusije<p>
|
<a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/cryptoparty"
|
||||||
<p>20:00 <a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/cryptoparty">Cryptoparty</a><p>
|
>Cryptoparty</a
|
||||||
<p>22:00 Kraj<p>
|
>
|
||||||
|
</p>
|
||||||
|
<p></p>
|
||||||
|
<p>
|
||||||
|
14:00
|
||||||
|
<a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/hakaton">Hakaton</a>
|
||||||
|
</p>
|
||||||
|
<p></p>
|
||||||
|
<p>
|
||||||
|
16:00
|
||||||
|
<a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/lightningtalks"
|
||||||
|
>Lightning talks</a
|
||||||
|
>
|
||||||
|
</p>
|
||||||
|
<p></p>
|
||||||
|
<p>18:00 Diskusije</p>
|
||||||
|
<p></p>
|
||||||
|
<p>
|
||||||
|
20:00
|
||||||
|
<a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/cryptoparty"
|
||||||
|
>Cryptoparty</a
|
||||||
|
>
|
||||||
|
</p>
|
||||||
|
<p></p>
|
||||||
|
<p>22:00 Kraj</p>
|
||||||
|
<p></p>
|
||||||
|
|
||||||
<h2 id="what"><a href="#what">What?</a></h2>
|
<h2 id="what"><a href="#what">What?</a></h2>
|
||||||
<p>Deconference is the inaugural conference organized by <a href="https://dmz.rs">Decentrala</a>, a Belgrade hackerspace. It serves as a platform for individuals to present and discuss ideas related to decentralization in all its forms.</p>
|
<p>
|
||||||
|
Deconference is the inaugural conference organized by
|
||||||
|
<a href="https://dmz.rs">Decentrala</a>, a Belgrade hackerspace. It serves as
|
||||||
|
a platform for individuals to present and discuss ideas related to
|
||||||
|
decentralization in all its forms.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2 id="when-and-where"><a href="#when-and-where">When & Where?</a></h2>
|
<h2 id="when-and-where"><a href="#when-and-where">When & Where?</a></h2>
|
||||||
<p>Deconference will take place all day on Sunday, September 15, 2024, at Cultural Center Magacin, located at <a href="https://osm.org/go/xf3Fz31te?node=1226456745">Kraljevića Marka 4-8, Belgrade</a>. The evening prior, a social gathering will be hosted at <a href="https://dckrov.rs/">Community Center Krov</a>, located at <a href="https://osm.org/go/xf3HQQdIH">Kraljice Marije 47, Belgrade</a>.</p>
|
<p>
|
||||||
|
Deconference will take place all day on Sunday, September 15, 2024, at
|
||||||
|
Cultural Center Magacin, located at
|
||||||
|
<a href="https://osm.org/go/xf3Fz31te?node=1226456745"
|
||||||
|
>Kraljevića Marka 4-8, Belgrade</a
|
||||||
|
>. The evening prior, a social gathering will be hosted at
|
||||||
|
<a href="https://dckrov.rs/">Community Center Krov</a>, located at
|
||||||
|
<a href="https://osm.org/go/xf3HQQdIH">Kraljice Marije 47, Belgrade</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2 id="why"><a href="#why">Why?</a></h2>
|
<h2 id="why"><a href="#why">Why?</a></h2>
|
||||||
|
|
||||||
<p>Decentrala was founded by a small group of enthusiasts united by the idea of technological decentralization. Over the past year and a half, we've organized over 160 events—lectures, workshops, discussions, hackathons—aimed at democratizing technological knowledge and educating people about privacy, open source principles, the right to repair (and how to repair), digital assets, and usage rights. Since day one, our approach has been to inform individuals about alternatives rather than impose opinions upon them.</p>
|
<p>
|
||||||
|
Decentrala was founded by a small group of enthusiasts united by the idea of
|
||||||
|
technological decentralization. Over the past year and a half, we've organized
|
||||||
|
over 160 events—lectures, workshops, discussions, hackathons—aimed at
|
||||||
|
democratizing technological knowledge and educating people about privacy, open
|
||||||
|
source principles, the right to repair (and how to repair), digital assets,
|
||||||
|
and usage rights. Since day one, our approach has been to inform individuals
|
||||||
|
about alternatives rather than impose opinions upon them.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Through engaging with diverse visitors, many from non-technical backgrounds, we've come to realize that decentralization encompasses more than just "open technology." Many activists and organizations today advocate for various forms of decentralization. Therefore, we welcome stories about decentralization from diverse perspectives.</p>
|
<p>
|
||||||
|
Through engaging with diverse visitors, many from non-technical backgrounds,
|
||||||
|
we've come to realize that decentralization encompasses more than just "open
|
||||||
|
technology." Many activists and organizations today advocate for various forms
|
||||||
|
of decentralization. Therefore, we welcome stories about decentralization from
|
||||||
|
diverse perspectives.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2 id="who"><a href="#who">Who?</a></h2>
|
<h2 id="who"><a href="#who">Who?</a></h2>
|
||||||
|
|
||||||
<p>Deconference is an open platform for anyone interested in discussing, demonstrating, or exploring decentralization. You can register your event by emailing <a href="mailto:dekonferencija@dmz.rs">dekonferencija@dmz.rs</a> up until the day of the Deconference (September 15).</p>
|
<p>
|
||||||
|
Deconference is an open platform for anyone interested in discussing,
|
||||||
|
demonstrating, or exploring decentralization. You can register your event by
|
||||||
|
emailing <a href="mailto:dekonferencija@dmz.rs">dekonferencija@dmz.rs</a> up
|
||||||
|
until the day of the Deconference (September 15).
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>We will update this section as topics are confirmed.</p>
|
<p>We will update this section as topics are confirmed.</p>
|
||||||
|
|
||||||
<h2 id="how"><a href="#how">How?</a></h2>
|
<h2 id="how"><a href="#how">How?</a></h2>
|
||||||
|
|
||||||
<p>The Deconference is funded by the organizers' private assets. Like all of Decentrala's activities, Deconference is free for all attendees. Unfortunately, we are unable to provide grants to lecturers or presenters.</p>
|
<p>
|
||||||
|
The Deconference is funded by the organizers' private assets. Like all of
|
||||||
|
Decentrala's activities, Deconference is free for all attendees.
|
||||||
|
Unfortunately, we are unable to provide grants to lecturers or presenters.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Decentrala accepts donations exclusively from individuals.</p>
|
<p>Decentrala accepts donations exclusively from individuals.</p>
|
||||||
|
|||||||
@@ -1,27 +1,68 @@
|
|||||||
<h1>Welcome!</h1>
|
<h1>Welcome!</h1>
|
||||||
<p>
|
<p>
|
||||||
We are <em>Decentrala</em> - a group of enthusiasts gathered around the idea of decentralization and knowledge sharing.
|
We are <em>Decentrala</em> - a group of enthusiasts gathered around the idea
|
||||||
Here are some more facts about us:
|
of decentralization and knowledge sharing. Here are some more facts about us:
|
||||||
</p>
|
</p>
|
||||||
<dl>
|
<dl>
|
||||||
|
|
||||||
<dt>Motivation:</dt>
|
<dt>Motivation:</dt>
|
||||||
<dd>Decentralization promotes <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#odrzivost">sustainability</a>, <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#dostupnost">availability</a>, <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#pristupacnost">accesibility</a>, <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#nezavisnost">autonomy</a>, <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#privatnost">privacy</a> and <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#sloboda">freedom</a>. On those networks we have less <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#manipulacija">manipulation</a>, <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#propaganda">propaganda</a>, ads, and <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#neopterecenost-paznje-sporednim-stvarima">are not designed to lock your attention (dumbing down)</a>.
|
<dd>
|
||||||
<a href="https://forum.dmz.rs/t/zasto-nam-je-decentralizacija-bitna/506/1">Tell us why decentralization is important to you</a>
|
Decentralization promotes
|
||||||
|
<a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#odrzivost"
|
||||||
|
>sustainability</a
|
||||||
|
>,
|
||||||
|
<a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#dostupnost"
|
||||||
|
>availability</a
|
||||||
|
>,
|
||||||
|
<a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#pristupacnost"
|
||||||
|
>accesibility</a
|
||||||
|
>,
|
||||||
|
<a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#nezavisnost"
|
||||||
|
>autonomy</a
|
||||||
|
>,
|
||||||
|
<a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#privatnost"
|
||||||
|
>privacy</a
|
||||||
|
>
|
||||||
|
and
|
||||||
|
<a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#sloboda"
|
||||||
|
>freedom</a
|
||||||
|
>. On those networks we have less
|
||||||
|
<a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#manipulacija"
|
||||||
|
>manipulation</a
|
||||||
|
>,
|
||||||
|
<a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#propaganda"
|
||||||
|
>propaganda</a
|
||||||
|
>, ads, and
|
||||||
|
<a
|
||||||
|
href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#neopterecenost-paznje-sporednim-stvarima"
|
||||||
|
>
|
||||||
|
are not designed to lock your attention (dumbing down)
|
||||||
|
</a>
|
||||||
|
.
|
||||||
|
<a href="https://forum.dmz.rs/t/zasto-nam-je-decentralizacija-bitna/506/1">
|
||||||
|
Tell us why decentralization is important to you
|
||||||
|
</a>
|
||||||
</dd>
|
</dd>
|
||||||
<dt>Knowledge:</dt>
|
<dt>Knowledge:</dt>
|
||||||
<dd>
|
<dd>
|
||||||
All our workshops are free and open to everyone.
|
All our workshops are free and open to everyone. Also, if you have something
|
||||||
Also, if you have something to share, feel free to announce the event on the <a href="https://forum.dmz.rs"></a>Forum</a>.
|
to share, feel free to announce the event on the
|
||||||
|
<a href="https://forum.dmz.rs">Forum</a>.
|
||||||
</dd>
|
</dd>
|
||||||
<dt>Actions:</dt>
|
<dt>Actions:</dt>
|
||||||
<dd>From time to time we organize actions, hackathons, crypto parties, exhibitions, etc.</dd>
|
<dd>
|
||||||
|
From time to time we organize actions, hackathons, crypto parties,
|
||||||
|
exhibitions, etc.
|
||||||
|
</dd>
|
||||||
<dt>Services:</dt>
|
<dt>Services:</dt>
|
||||||
<dd>Our servers run various services (like e-mail, git, wiki, etc...) that are open to everyone.</dd>
|
<dd>
|
||||||
|
Our servers run various services (like e-mail, git, wiki, etc...) that are
|
||||||
|
open to everyone.
|
||||||
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<p>
|
<p>
|
||||||
If you are still interested, you can create an <a href="/en/account">account</a>
|
If you are still interested, you can create an
|
||||||
on our server which will enable the use of all our <a href="/en/services">services</a>.
|
<a href="/en/account">account</a> on our server which will enable the use of
|
||||||
If you want to see first how it all looks, you can come to one of our
|
all our <a href="/en/services">services</a>. If you want to see first how it
|
||||||
<a href="/en/events">event</a>, and meet us there!
|
all looks, you can come to one of our <a href="/en/events">event</a>, and meet
|
||||||
|
us there!
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -43,8 +43,8 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td><a href="https://jitsi.dmz.rs/">Jitsi</a></td>
|
<td><a href="https://jitsi.dmz.rs/">Jitsi</a></td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://jitsi.org/">Jitsi.org</a> meeting app, conferences, group video calls, online events, alternative
|
<a href="https://jitsi.org/">Jitsi.org</a> meeting app, conferences, group
|
||||||
to zoom.
|
video calls, online events, alternative to zoom.
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<!--<tr>
|
<!--<tr>
|
||||||
|
|||||||
@@ -2,44 +2,76 @@
|
|||||||
|
|
||||||
<div>
|
<div>
|
||||||
<p>
|
<p>
|
||||||
Decentrala is a community, united around the principles of decentralized technology and the spreading of knowledge.
|
Decentrala is a community, united around the principles of decentralized
|
||||||
|
technology and the spreading of knowledge.
|
||||||
</p>
|
</p>
|
||||||
<label>Key values include:</label>
|
<div class="values">
|
||||||
<ul>
|
<label>Our key values include:</label>
|
||||||
<li>Equal access to technology</li>
|
<ul>
|
||||||
<li>Free software</li>
|
<li>Equal access to technology</li>
|
||||||
<li>Privacy and security</li>
|
<li>Free and open source software</li>
|
||||||
</ul>
|
<li>Privacy and security</li>
|
||||||
<p> Donations are accepted only from individuals, with no conditions or obligations. </p>
|
</ul>
|
||||||
<p> Only open-source services are hosted on the Decentrala infrastructure. </p>
|
</div>
|
||||||
<p> Parts of the statute can be defined immutable, and cannot be voted on. </p>
|
<p>
|
||||||
<p>
|
Donations are accepted only from individuals, with no conditions or
|
||||||
Every member or group has the right to act in the name of Decentrala,
|
obligations.
|
||||||
if their initiatives align with Decentrala’s goals and statute,
|
</p>
|
||||||
as long as their events are announced and explained on Decentrala’s public digital communication channels.
|
<p>Only open-source services are hosted on the Decentrala infrastructure.</p>
|
||||||
|
<p>Parts of the statute can be defined immutable, and cannot be voted on.</p>
|
||||||
|
<p>
|
||||||
|
Every member or group has the right to act in the name of Decentrala, if
|
||||||
|
their initiatives align with Decentrala's goals and statute, as long as
|
||||||
|
their events are announced and explained on Decentrala's public digital
|
||||||
|
communication channels.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Decentrala rules and statutes are decided independently by a voting body that makes decisions on the principles of direct democracy,
|
Decentrala rules and statutes are decided independently by a voting body
|
||||||
consensus, or by a simple majority of two-thirds of the total number of collective members.
|
that makes decisions on the principles of direct democracy, consensus, or by
|
||||||
|
a simple majority of two-thirds of the total number of collective members.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2>Voting Body</h2>
|
<h2>Voting Body</h2>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<p>Membership applications are accepted only if two-thirds of attending members vote in favor. </p>
|
<p>
|
||||||
<p>Only members who are physically present have the right to vote.</p
|
Membership applications are accepted only if two-thirds of attending members
|
||||||
|
vote in favor.
|
||||||
|
</p>
|
||||||
|
<p>Only members who are physically present have the right to vote.</p>
|
||||||
<p>There is no limit on the number of members of the voting body.</p>
|
<p>There is no limit on the number of members of the voting body.</p>
|
||||||
<p> An individual may withdraw from the union at any time, or may be expelled by a two-thirds majority of present members. </p
|
<p>
|
||||||
<p> If a member of a voting body is absent during three consecutive meetings, they are automatically excluded from the voting body. </p>
|
An individual may withdraw from the union at any time, or may be expelled by
|
||||||
<p> A member can be re-admitted to the governing body according to the predefined procedure for adding new members, if they are present at that meeting. </p>
|
a two-thirds majority of present members.
|
||||||
<p> The current members of the voting body are using pseudonyms climatechanged, malin, coja, bora, mad3v, wingaxe, nothke, txrpe, euffrat, netstat. </p>
|
</p>
|
||||||
|
<p>
|
||||||
|
If a member of a voting body is absent during three consecutive meetings,
|
||||||
|
they are automatically excluded from the voting body.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
A member can be re-admitted to the governing body according to the
|
||||||
|
predefined procedure for adding new members, if they are present at that
|
||||||
|
meeting.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The current members of the voting body are using pseudonyms malin, coja,
|
||||||
|
bora, mad3v, txrpe, euffrat, netstat.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2>Meetings</h2>
|
<h2>Meetings</h2>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<p> The vote of the polling body is valid if at least three members of the polling body are present. </p>
|
<p>
|
||||||
<p> The meeting time and place of the Decentral Assembly must be announced at least seven days in advance of the meeting on the Decentrala's forum. </p>
|
The vote of the polling body is valid if at least three members of the
|
||||||
<p> The voting body's session should be held at least once every two months. </p>
|
polling body are present.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The meeting time and place of the Decentral Assembly must be announced at
|
||||||
|
least seven days in advance of the meeting on the Decentrala's forum.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The voting body's session should be held at least once every two months.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -24,16 +24,14 @@
|
|||||||
By simply using services we are hosting, conts as contributing, because in
|
By simply using services we are hosting, conts as contributing, because in
|
||||||
that way you joining the decetralization.
|
that way you joining the decetralization.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>Also, we accept donations in bitcoin to the following address:</p>
|
||||||
Also, we accept donations in bitcoin and monero to the following addresses:
|
|
||||||
</p>
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Bitcoin: <i>bc1qjhsfgq79wuzzv32yml9zglwzf9qcwfj3atuy74</i></li>
|
<li>Bitcoin: <i>bc1qjhsfgq79wuzzv32yml9zglwzf9qcwfj3atuy74</i></li>
|
||||||
<li>
|
<!-- <li>
|
||||||
Monero:
|
Monero:
|
||||||
<i
|
<i
|
||||||
>8BESz45LnxrgCwZP32KieiN1D4LinCfsS1YjdFHfGXrVCmPs35167QsW1gd7qbff4UAtBbT6oWrkbfZnJm71HornVRiRZFS</i
|
>8BESz45LnxrgCwZP32KieiN1D4LinCfsS1YjdFHfGXrVCmPs35167QsW1gd7qbff4UAtBbT6oWrkbfZnJm71HornVRiRZFS</i
|
||||||
>
|
>
|
||||||
</li>
|
</li> -->
|
||||||
</ul>
|
</ul>
|
||||||
</dd>
|
</dd>
|
||||||
|
|||||||
@@ -1,10 +1,23 @@
|
|||||||
<h1>O nama</h1>
|
<h1>O nama</h1>
|
||||||
<dl>
|
<dl>
|
||||||
<dt>Statut:</dt>
|
<dt>Statut:</dt>
|
||||||
<dd> Sve odluke se donose po principu direktne demokratije. Nas statut mozete pogledati na <a href="/statute">stranici za statut</a>. </dd>
|
<dd>
|
||||||
|
Sve odluke se donose po principu direktne demokratije. Nas statut mozete
|
||||||
|
pogledati na <a href="/statute">stranici za statut</a>.
|
||||||
|
</dd>
|
||||||
|
|
||||||
<dt>Kontakt:</dt>
|
<dt>Kontakt:</dt>
|
||||||
<dd>Možeš nam poslati mejl na adresu <a href="mailto:dmz@dmz.rs">dmz@dmz.rs</a> ili se možeš pridružiti našem <a href="https://forum.dmz.rs">Forumu</a>.</dd>
|
<dd>
|
||||||
<dd>Takođe smo dostupni i na <a href="https://balkan.fedive.rs/@decentrala">Fediversu!</a></dd>
|
Možeš nam poslati mejl na adresu
|
||||||
<dd>U slučaju da pronađeš <em>bug</em> na sajtu, bili bismo ti jako zahvalni ako nam ga prijaviš.</dd>
|
<a href="mailto:dmz@dmz.rs">dmz@dmz.rs</a> ili se možeš pridružiti našem
|
||||||
|
<a href="https://forum.dmz.rs">Forumu</a>.
|
||||||
|
</dd>
|
||||||
|
<dd>
|
||||||
|
Takođe smo dostupni i na
|
||||||
|
<a href="https://balkan.fedive.rs/@decentrala">Fediversu!</a>
|
||||||
|
</dd>
|
||||||
|
<dd>
|
||||||
|
U slučaju da pronađeš <em>bug</em> na sajtu, bili bismo ti jako zahvalni ako
|
||||||
|
nam ga prijaviš.
|
||||||
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|||||||
@@ -1,8 +1,22 @@
|
|||||||
<h1>Nalog</h1>
|
<h1>Nalog</h1>
|
||||||
<p>Ako si napravio nalog na dmz.rs možeš koristiti naš XMPP i e-mail server, kao i ostale servise koji podržavaju LDAP login.<p>
|
<p>
|
||||||
<p>Za više o XMPP-u pogledaj <a href="https://wiki.dmz.rs/en/tutorial/conversations-srpski">tutorial</a>. <p>
|
Ako si napravio nalog na dmz.rs možeš koristiti naš XMPP i e-mail server, kao
|
||||||
<p>Podešavanja za <a href="https://www.thunderbird.net">Thunderbird</a> mail klijent možeš pogledati na <a href="/img/mailsettings.png">slici</a>.<p>
|
i ostale servise koji podržavaju LDAP login.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Za više o XMPP-u pogledaj
|
||||||
|
<a href="https://wiki.dmz.rs/en/tutorial/conversations-srpski">tutorial</a>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Podešavanja za <a href="https://www.thunderbird.net">Thunderbird</a> mail
|
||||||
|
klijent možeš pogledati na <a href="/img/mailsettings.png">slici</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p><a href="/account/register/">Registruj se</a><p>
|
<div class="auth-wrap">
|
||||||
<p><a href="/account/unregister/">Izbriši nalog</a><p>
|
<p><a href="/account/register/">Registruj se</a></p>
|
||||||
<p><a href="/account/changepassword/">Promeni lozinku</a><p>
|
<p></p>
|
||||||
|
<p><a href="/account/unregister/">Izbriši nalog</a></p>
|
||||||
|
<p></p>
|
||||||
|
<p><a href="/account/changepassword/">Promeni lozinku</a></p>
|
||||||
|
<p></p>
|
||||||
|
</div>
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
Ova stranica je trenutno u izradi...
|
Ova stranica je trenutno u izradi...
|
||||||
|
|
||||||
|
|||||||
@@ -1,35 +1,89 @@
|
|||||||
<h1>Dekonferencija</h1>
|
<h1>Dekonferencija</h1>
|
||||||
|
|
||||||
<h2 id="program"><a href="#program">Program</a></h2>
|
<h2 id="program"><a href="#program">Program</a></h2>
|
||||||
<p>11:00 Otvaranje<p>
|
<p>11:00 Otvaranje</p>
|
||||||
<p>12:00 <a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/cryptoparty">Cryptoparty</a><p>
|
<p>
|
||||||
<p>14:00 <a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/hakaton">Hakaton</a><p>
|
12:00
|
||||||
<p>16:00 <a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/lightningtalks">Lightning talks</a><p>
|
<a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/cryptoparty"
|
||||||
<p>18:00 Diskusije<p>
|
>Cryptoparty</a
|
||||||
<p>20:00 <a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/cryptoparty">Cryptoparty</a><p>
|
>
|
||||||
<p>22:00 Kraj<p>
|
</p>
|
||||||
|
<p>
|
||||||
|
14:00
|
||||||
|
<a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/hakaton">Hakaton</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
16:00
|
||||||
|
<a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/lightningtalks"
|
||||||
|
>Lightning talks</a
|
||||||
|
>
|
||||||
|
</p>
|
||||||
|
<p>18:00 Diskusije</p>
|
||||||
|
<p>
|
||||||
|
20:00
|
||||||
|
<a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/cryptoparty"
|
||||||
|
>Cryptoparty</a
|
||||||
|
>
|
||||||
|
</p>
|
||||||
|
<p>22:00 Kraj</p>
|
||||||
|
|
||||||
<h2 id="what"><a href="#what">Šta?</a></h2>
|
<h2 id="what"><a href="#what">Šta?</a></h2>
|
||||||
<p>Dekonferencija je prva konferencija organizovana od strane <a href="https://dmz.rs">Decentrale</a>, Beogradskog hakerspejsa. Dekonferencija služi kao platforma za predstavljanje i diskusiju ideja decentralizacije u svim svojim oblicima.</p>
|
<p>
|
||||||
|
Dekonferencija je prva konferencija organizovana od strane
|
||||||
|
<a href="https://dmz.rs">Decentrale</a>, Beogradskog hakerspejsa.
|
||||||
|
Dekonferencija služi kao platforma za predstavljanje i diskusiju ideja
|
||||||
|
decentralizacije u svim svojim oblicima.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2 id="when-and-where"><a href="#when-and-where">Kad & Gde?</a></h2>
|
<h2 id="when-and-where"><a href="#when-and-where">Kad & Gde?</a></h2>
|
||||||
<p>Dekonferencija će se održati u nedelju, 15.-og Septembra, 2024, u Kulturnom Centru Magacin, na adresi <a href="https://osm.org/go/xf3Fz31te?node=1226456745">Kraljevića Marka 4-8, Beograd</a>. Veče pre, održaće se druženje povodom organizovanja konferencije u prostorijama <a href="https://dckrov.rs/">Društvenog Centra Krov</a>, na adresi <a href="https://osm.org/go/xf3HQQdIH">Kraljice Marije 47, Beograd</a>.</p>
|
<p>
|
||||||
|
Dekonferencija će se održati u nedelju, 15.-og Septembra, 2024, u Kulturnom
|
||||||
|
Centru Magacin, na adresi
|
||||||
|
<a href="https://osm.org/go/xf3Fz31te?node=1226456745"
|
||||||
|
>Kraljevića Marka 4-8, Beograd</a
|
||||||
|
>. Veče pre, održaće se druženje povodom organizovanja konferencije u
|
||||||
|
prostorijama <a href="https://dckrov.rs/">Društvenog Centra Krov</a>, na
|
||||||
|
adresi <a href="https://osm.org/go/xf3HQQdIH">Kraljice Marije 47, Beograd</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2 id="why"><a href="#why">Zašto?</a></h2>
|
<h2 id="why"><a href="#why">Zašto?</a></h2>
|
||||||
|
|
||||||
<p>Decentrala je osnovana od strane male grupe entuzijasta udružene oko ideje decentralizacije tehnologije. Poslednjih godinu i po, organizovali smo više od 160 događaja—predavanja, radionica, diskusija, hakatona—sa ciljem demokratizacije tehnološkog znanja i edukacije o privatnosti, open source principa, prava na popravku (i kako popraviti), digitalna svojina, i pravo korišćenja. Od prvog dana, naš pristup je bio da informišemo pojedince o alternativama umesto da im namećemo naše mišljenje.</p>
|
<p>
|
||||||
|
Decentrala je osnovana od strane male grupe entuzijasta udružene oko ideje
|
||||||
|
decentralizacije tehnologije. Poslednjih godinu i po, organizovali smo više od
|
||||||
|
160 događaja—predavanja, radionica, diskusija, hakatona—sa ciljem
|
||||||
|
demokratizacije tehnološkog znanja i edukacije o privatnosti, open source
|
||||||
|
principa, prava na popravku (i kako popraviti), digitalna svojina, i pravo
|
||||||
|
korišćenja. Od prvog dana, naš pristup je bio da informišemo pojedince o
|
||||||
|
alternativama umesto da im namećemo naše mišljenje.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Vremenom, angažovanjem sa raznovrsnim posetiocima, od kojih su mnogi iz ne-tehničkih sfera, shvatili smo da decentralizacija obuhvata više od samo "otvorene tehnologije." Mnogi aktivisti i organizacije se danas zalažu za različite oblike decentralizacije. Zato, smatramo da su dobrodošle priče decentralizacije iz različitih perspektiva.</p>
|
<p>
|
||||||
|
Vremenom, angažovanjem sa raznovrsnim posetiocima, od kojih su mnogi iz
|
||||||
|
ne-tehničkih sfera, shvatili smo da decentralizacija obuhvata više od samo
|
||||||
|
"otvorene tehnologije." Mnogi aktivisti i organizacije se danas zalažu za
|
||||||
|
različite oblike decentralizacije. Zato, smatramo da su dobrodošle priče
|
||||||
|
decentralizacije iz različitih perspektiva.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2 id="who"><a href="#who">Ko?</a></h2>
|
<h2 id="who"><a href="#who">Ko?</a></h2>
|
||||||
|
|
||||||
<p>Dekonferencija je otvorena platforma za sve zainteresovane za diskusiju, demonstraciju, ili istraživanje decentralizacije. Možete registrovati vaš događaj slanjem email-a na <a href="mailto:dekonferencija@dmz.rs">dekonferencija@dmz.rs</a> do dana Dekonferencije (15.-ti Septembar).</p>
|
<p>
|
||||||
|
Dekonferencija je otvorena platforma za sve zainteresovane za diskusiju,
|
||||||
|
demonstraciju, ili istraživanje decentralizacije. Možete registrovati vaš
|
||||||
|
događaj slanjem email-a na
|
||||||
|
<a href="mailto:dekonferencija@dmz.rs">dekonferencija@dmz.rs</a> do dana
|
||||||
|
Dekonferencije (15.-ti Septembar).
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Osvežićemo ovaj deo kako se teme događaja potvrde.</p>
|
<p>Osvežićemo ovaj deo kako se teme događaja potvrde.</p>
|
||||||
|
|
||||||
<h2 id="how"><a href="#how">Kako?</a></h2>
|
<h2 id="how"><a href="#how">Kako?</a></h2>
|
||||||
|
|
||||||
<p>Dekonferencija je finansirana od strane ličnih sredstava organizatora. Kao i sve aktivnosti Decentrale, Dekonferencija je besplatna svima. Nažalost, nismo u stanju da pružimo subvencije predavačima.</p>
|
<p>
|
||||||
|
Dekonferencija je finansirana od strane ličnih sredstava organizatora. Kao i
|
||||||
|
sve aktivnosti Decentrale, Dekonferencija je besplatna svima. Nažalost, nismo
|
||||||
|
u stanju da pružimo subvencije predavačima.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Decentrala prihvata donacije isključivo od fizičkih lica.</p>
|
<p>Decentrala prihvata donacije isključivo od fizičkih lica.</p>
|
||||||
|
|||||||
@@ -1,27 +1,67 @@
|
|||||||
<h1>Dobrodošli!</h1>
|
<h1>Dobrodošli!</h1>
|
||||||
<p>
|
<p>
|
||||||
Mi smo <em>Decentrala</em> - grupa entuzijasta okupljena oko ideja decentralizacije i slobodnog širenja znanja.
|
Mi smo <em>Decentrala</em> - grupa entuzijasta okupljena oko ideja
|
||||||
Zvuči interesantno? Evo još nekih stvari o nama:
|
decentralizacije i slobodnog širenja znanja. Zvuči interesantno? Evo još nekih
|
||||||
|
stvari o nama:
|
||||||
</p>
|
</p>
|
||||||
<dl>
|
<dl>
|
||||||
<dt>Motivacija:</dt>
|
<dt>Motivacija:</dt>
|
||||||
<dd>Decentralizacijom postizemo <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#odrzivost">odrzivost</a>, <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#dostupnost">dostupnost</a>, <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#pristupacnost">pristupacnost</a>, <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#nezavisnost">nezavisnost</a>, <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#privatnost">privatnost</a> i <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#sloboda">slobodu</a>. Na ovim mrezama ima manje <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#manipulacija">manipulacije</a>, <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#propaganda">propagande</a>, reklama, i <a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#neopterecenost-paznje-sporednim-stvarima">nisu dizajnirane za zadrzavanje paznje (zaglupljivanje)</a>.
|
<dd>
|
||||||
<a href="https://forum.dmz.rs/t/zasto-nam-je-decentralizacija-bitna/506/1">Recite zasto je vama decentralizacija bitna</a>
|
Decentralizacijom postizemo
|
||||||
|
<a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#odrzivost"
|
||||||
|
>odrzivost</a
|
||||||
|
>,
|
||||||
|
<a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#dostupnost"
|
||||||
|
>dostupnost</a
|
||||||
|
>,
|
||||||
|
<a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#pristupacnost"
|
||||||
|
>pristupacnost</a
|
||||||
|
>,
|
||||||
|
<a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#nezavisnost"
|
||||||
|
>nezavisnost</a
|
||||||
|
>,
|
||||||
|
<a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#privatnost"
|
||||||
|
>privatnost</a
|
||||||
|
>
|
||||||
|
i
|
||||||
|
<a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#sloboda"
|
||||||
|
>slobodu</a
|
||||||
|
>. Na ovim mrezama ima manje
|
||||||
|
<a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#manipulacija"
|
||||||
|
>manipulacije</a
|
||||||
|
>,
|
||||||
|
<a href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#propaganda"
|
||||||
|
>propagande</a
|
||||||
|
>, reklama, i
|
||||||
|
<a
|
||||||
|
href="https://wiki.dmz.rs/en/zastojedecentralizacijabitna#neopterecenost-paznje-sporednim-stvarima"
|
||||||
|
>nisu dizajnirane za zadrzavanje paznje (zaglupljivanje)</a
|
||||||
|
>.
|
||||||
|
<a href="https://forum.dmz.rs/t/zasto-nam-je-decentralizacija-bitna/506/1"
|
||||||
|
>Recite zasto je vama decentralizacija bitna</a
|
||||||
|
>
|
||||||
</dd>
|
</dd>
|
||||||
<dt>Znanje:</dt>
|
<dt>Znanje:</dt>
|
||||||
<dd>Sve naše radionice su besplatne i otvorene za sve zainteresovane.
|
<dd>
|
||||||
Ako želiš nešto da podeliš najavi se na našem <a href="https://forum.dmz.rs">Forumu</a> i održi radionicu kod nas!
|
Sve naše radionice su besplatne i otvorene za sve zainteresovane. Ako želiš
|
||||||
|
nešto da podeliš najavi se na našem
|
||||||
|
<a href="https://forum.dmz.rs">Forumu</a> i održi radionicu kod nas!
|
||||||
</dd>
|
</dd>
|
||||||
<dt>Akcije:</dt>
|
<dt>Akcije:</dt>
|
||||||
<dd>Povremeno organizujemo različite akcije, hakatone, crypto-partije, izložbe i slične događaje otvorene za sve
|
<dd>
|
||||||
zainteresovane. </dd>
|
Povremeno organizujemo različite akcije, hakatone, crypto-partije, izložbe i
|
||||||
|
slične događaje otvorene za sve zainteresovane.
|
||||||
|
</dd>
|
||||||
<dt>Servisi:</dt>
|
<dt>Servisi:</dt>
|
||||||
<dd>Na našim serverima pokrećemo razne servise (email, git, wiki i druge) koji su otvoreni za sve i koji se mogu
|
<dd>
|
||||||
koristiti sa ili bez našeg naloga.</dd>
|
Na našim serverima pokrećemo razne servise (email, git, wiki i druge) koji
|
||||||
|
su otvoreni za sve i koji se mogu koristiti sa ili bez našeg naloga.
|
||||||
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<p>
|
<p>
|
||||||
Ako si i dalje zainteresovan, možeš napraviti <a href="/account">nalog</a> na našem serveru koji će ti
|
Ako si i dalje zainteresovan, možeš napraviti <a href="/account">nalog</a> na
|
||||||
omogućiti korišćenje svih naših <a href="/services">servisa</a>.
|
našem serveru koji će ti omogućiti korišćenje svih naših
|
||||||
Ako želiš prvo da vidiš kako to sve izgleda u realnosti, možeš doći na neki od naših <a
|
<a href="/services">servisa</a>. Ako želiš prvo da vidiš kako to sve izgleda u
|
||||||
href="/events">događaja</a>, i tu nas upoznati!
|
realnosti, možeš doći na neki od naših <a href="/events">događaja</a>, i tu
|
||||||
|
nas upoznati!
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -46,7 +46,8 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td><a href="https://jitsi.dmz.rs/">Jitsi</a></td>
|
<td><a href="https://jitsi.dmz.rs/">Jitsi</a></td>
|
||||||
<td>
|
<td>
|
||||||
<a href="https://jitsi.org/">Jitsi.org</a> aplikacija za sastanke, groupne video pozive, online dogadjaje, alternativa za zoom.
|
<a href="https://jitsi.org/">Jitsi.org</a> aplikacija za sastanke, groupne
|
||||||
|
video pozive, online dogadjaje, alternativa za zoom.
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<!--<tr>
|
<!--<tr>
|
||||||
|
|||||||
@@ -3,9 +3,16 @@
|
|||||||
<div>
|
<div>
|
||||||
<p>
|
<p>
|
||||||
Decentrala je zajednica okupljena oko decentralizacije tehnologija i širenja
|
Decentrala je zajednica okupljena oko decentralizacije tehnologija i širenja
|
||||||
znanja. Decentralizacija uključuje ravnopravnost korišćenja tehnologije,
|
znanja.
|
||||||
slobodnog softvera, privatnost i bezbednost.
|
|
||||||
</p>
|
</p>
|
||||||
|
<div class="values">
|
||||||
|
<label> Decentralizacija uključuje: </label>
|
||||||
|
<ul>
|
||||||
|
<li>Ravnopravnost korišćenja tehnologije</li>
|
||||||
|
<li>Slobodan software otvorenog koda</li>
|
||||||
|
<li>Privatnost i bezbednost.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
<p>
|
<p>
|
||||||
Na Decentralinoj arhitekturi hostuju se samo servisi koji su otvorenog koda
|
Na Decentralinoj arhitekturi hostuju se samo servisi koji su otvorenog koda
|
||||||
</p>
|
</p>
|
||||||
@@ -51,8 +58,8 @@
|
|||||||
dodavanja novog clana, ako je prisutan na tom sastanku.
|
dodavanja novog clana, ako je prisutan na tom sastanku.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Trenutni članovi glasačkog tela su pod pseudonimom climatechanged,
|
Trenutni članovi glasačkog tela su pod pseudonimom malin, coja, bora, mad3v,
|
||||||
malin, coja, bora, mad3v, wingaxe, nothke, txrpe, fl3ka, euffrat, netstat.
|
txrpe, euffrat, netstat.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -24,14 +24,16 @@
|
|||||||
Jednostavno koriscenje naseg softwera se takodje racuna kao doprinos, posto
|
Jednostavno koriscenje naseg softwera se takodje racuna kao doprinos, posto
|
||||||
bi se time pridruzili decentralizaciji.
|
bi se time pridruzili decentralizaciji.
|
||||||
</p>
|
</p>
|
||||||
<p>Takođe primamo donacije u bitcoinu i moneru na adresama:</p>
|
<p>Takođe primamo donacije u bitcoinu na adresi:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Bitcoin: <i>bc1qjhsfgq79wuzzv32yml9zglwzf9qcwfj3atuy74</i></li>
|
<li>Bitcoin: <i>bc1qjhsfgq79wuzzv32yml9zglwzf9qcwfj3atuy74</i></li>
|
||||||
|
<!--
|
||||||
<li>
|
<li>
|
||||||
Monero:
|
Monero:
|
||||||
<i
|
<i
|
||||||
>8BESz45LnxrgCwZP32KieiN1D4LinCfsS1YjdFHfGXrVCmPs35167QsW1gd7qbff4UAtBbT6oWrkbfZnJm71HornVRiRZFS</i
|
>8BESz45LnxrgCwZP32KieiN1D4LinCfsS1YjdFHfGXrVCmPs35167QsW1gd7qbff4UAtBbT6oWrkbfZnJm71HornVRiRZFS</i
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
|
-->
|
||||||
</ul>
|
</ul>
|
||||||
</dd>
|
</dd>
|
||||||
|
|||||||
41
poster.py
41
poster.py
@@ -7,10 +7,23 @@ EVENTS_CSV_PATH = "dogadjaji.csv"
|
|||||||
CURRENT_TIME = dt.date.today()
|
CURRENT_TIME = dt.date.today()
|
||||||
NEXT_MONTH = CURRENT_TIME + relativedelta.relativedelta(months=1, day=1)
|
NEXT_MONTH = CURRENT_TIME + relativedelta.relativedelta(months=1, day=1)
|
||||||
DAYS_OF_WEEK_SR = ("PON", "UTO", "SRE", "ČET", "PET", "SUB", "NED")
|
DAYS_OF_WEEK_SR = ("PON", "UTO", "SRE", "ČET", "PET", "SUB", "NED")
|
||||||
MONTHS_SR = ("Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust",\
|
MONTHS_SR = (
|
||||||
"Septembar", "Oktobar", "Novembar", "Decembar")
|
"Januar",
|
||||||
|
"Februar",
|
||||||
|
"Mart",
|
||||||
|
"April",
|
||||||
|
"Maj",
|
||||||
|
"Jun",
|
||||||
|
"Jul",
|
||||||
|
"Avgust",
|
||||||
|
"Septembar",
|
||||||
|
"Oktobar",
|
||||||
|
"Novembar",
|
||||||
|
"Decembar",
|
||||||
|
)
|
||||||
|
|
||||||
def load_events(csv_path:str) -> list[dict]:
|
|
||||||
|
def load_events(csv_path: str) -> list[dict]:
|
||||||
events = []
|
events = []
|
||||||
with open(csv_path) as csv_file:
|
with open(csv_path) as csv_file:
|
||||||
csv_reader = csv.reader(csv_file)
|
csv_reader = csv.reader(csv_file)
|
||||||
@@ -20,14 +33,17 @@ def load_events(csv_path:str) -> list[dict]:
|
|||||||
event_date_parsed = dt.datetime.strptime(event_date, "%d-%m-%Y").date()
|
event_date_parsed = dt.datetime.strptime(event_date, "%d-%m-%Y").date()
|
||||||
event_time = event[1]
|
event_time = event[1]
|
||||||
event_title = event[3]
|
event_title = event[3]
|
||||||
current_event = {"date":event_date_parsed,
|
current_event = {
|
||||||
"time":event_time,
|
"date": event_date_parsed,
|
||||||
"title":event_title.strip()}
|
"time": event_time,
|
||||||
|
"title": event_title.strip(),
|
||||||
|
}
|
||||||
if event_date_parsed >= NEXT_MONTH:
|
if event_date_parsed >= NEXT_MONTH:
|
||||||
events.append(current_event)
|
events.append(current_event)
|
||||||
return events
|
return events
|
||||||
|
|
||||||
def render_table(events:list[dict])-> str:
|
|
||||||
|
def render_table(events: list[dict]) -> str:
|
||||||
html = ""
|
html = ""
|
||||||
for event in events:
|
for event in events:
|
||||||
date = DAYS_OF_WEEK_SR[event["date"].weekday()]
|
date = DAYS_OF_WEEK_SR[event["date"].weekday()]
|
||||||
@@ -36,12 +52,13 @@ def render_table(events:list[dict])-> str:
|
|||||||
html += f"\t\t\t<tr> <td>{date}</td> <td>{day}.</td> <td>{title}</td> </tr>\n"
|
html += f"\t\t\t<tr> <td>{date}</td> <td>{day}.</td> <td>{title}</td> </tr>\n"
|
||||||
return html
|
return html
|
||||||
|
|
||||||
|
|
||||||
def render_page(table: str) -> str:
|
def render_page(table: str) -> str:
|
||||||
head = "<head><meta charset=\"UTF-8\"><link rel=\"stylesheet\"\
|
head = '<head><meta charset="UTF-8"><link rel="stylesheet"\
|
||||||
href=\"styles/poster.css\"><head>"
|
href="styles/poster.css"><head>'
|
||||||
header = "<h1>DECENTRALA</h1>"
|
header = "<h1>DECENTRALA</h1>"
|
||||||
subheader = f"<h2>Plan za {MONTHS_SR[NEXT_MONTH.month - 1]}</h2>"
|
subheader = f"<h2>Plan za {MONTHS_SR[NEXT_MONTH.month - 1]}</h2>"
|
||||||
link = "<div id=link><img src=\"/img/logo-light.svg\"> dmz.rs</div>"
|
link = '<div id=link><img src="/img/logo-light.svg"> dmz.rs</div>'
|
||||||
p1 = "<p>Radionice počinju u <strong>19h</strong> u Društvenom centru Krov\
|
p1 = "<p>Radionice počinju u <strong>19h</strong> u Društvenom centru Krov\
|
||||||
u <strong>Kraljice Marije 47</strong>.</p>"
|
u <strong>Kraljice Marije 47</strong>.</p>"
|
||||||
p2 = "<p>Ulaz u zgradu je u prolazu pored Štark prodavnice slatkiša, odmah\
|
p2 = "<p>Ulaz u zgradu je u prolazu pored Štark prodavnice slatkiša, odmah\
|
||||||
@@ -49,7 +66,8 @@ pored menjačnice. DC Krov je na poslednjem spratu.</p>"
|
|||||||
footer = f"{p1}{p2}{link}"
|
footer = f"{p1}{p2}{link}"
|
||||||
return f"<html>{head}<body><main>{header}{subheader}\
|
return f"<html>{head}<body><main>{header}{subheader}\
|
||||||
<table>{table}</table>{footer}</main></body></html>"
|
<table>{table}</table>{footer}</main></body></html>"
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
events = load_events(EVENTS_CSV_PATH)
|
events = load_events(EVENTS_CSV_PATH)
|
||||||
table = render_table(events)
|
table = render_table(events)
|
||||||
@@ -58,5 +76,6 @@ def main():
|
|||||||
f.write(page)
|
f.write(page)
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|||||||
326
prep.py
326
prep.py
@@ -1,7 +1,7 @@
|
|||||||
#! /usr/bin/env python3
|
from jinja2 import Environment, FileSystemLoader
|
||||||
|
|
||||||
import csv
|
import csv
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
import os
|
||||||
|
|
||||||
DAYS_SR = ["PON", "UTO", "SRE", "ČET", "PET", "SUB", "NED"]
|
DAYS_SR = ["PON", "UTO", "SRE", "ČET", "PET", "SUB", "NED"]
|
||||||
DAYS_EN = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]
|
DAYS_EN = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]
|
||||||
@@ -18,75 +18,38 @@ TYPES_DICT = {
|
|||||||
"party": ("zabava", "entertainment"),
|
"party": ("zabava", "entertainment"),
|
||||||
}
|
}
|
||||||
|
|
||||||
def load_events(csv_path:str) -> list[dict]:
|
env = Environment(loader=FileSystemLoader("template"))
|
||||||
|
|
||||||
|
|
||||||
|
def load_events(csv_path: str) -> list[dict]:
|
||||||
events = []
|
events = []
|
||||||
with open(csv_path) as csv_file:
|
with open(csv_path, encoding="utf-8") as csv_file:
|
||||||
csv_reader = csv.reader(csv_file, skipinitialspace=True)
|
csv_reader = csv.DictReader(csv_file, skipinitialspace=True)
|
||||||
next(csv_reader, None)
|
|
||||||
for event in csv_reader:
|
for event in csv_reader:
|
||||||
event_date = event[0]
|
event_date = event["datum"]
|
||||||
event_date_parsed = datetime.strptime(event_date, "%d-%m-%Y").date()
|
event_date_parsed = datetime.strptime(event_date, "%d-%m-%Y").date()
|
||||||
event_time = event[1]
|
event_time = event["vreme"]
|
||||||
event_location = event[2]
|
event_location = event["lokacija"]
|
||||||
event_title = event[3]
|
event_title = event["tema"]
|
||||||
types = event[4].split()
|
types = event["tip"].split()
|
||||||
try:
|
link = event.get("link", "")
|
||||||
link = event[5]
|
current_event = {
|
||||||
except IndexError:
|
"date": event_date_parsed,
|
||||||
link = ""
|
"time": event_time,
|
||||||
current_event = {"date":event_date_parsed,
|
"location": event_location,
|
||||||
"time":event_time,
|
"title": event_title.strip(),
|
||||||
"location": event_location,
|
"types": types,
|
||||||
"title":event_title.strip(),
|
"link": link,
|
||||||
"types": types,
|
}
|
||||||
"link": link}
|
|
||||||
events.append(current_event)
|
events.append(current_event)
|
||||||
return events
|
return events
|
||||||
|
|
||||||
def build_html(events: list[dict], dayNames: list[str], typesNames: dict) -> str:
|
|
||||||
events_html = []
|
|
||||||
for event in events:
|
|
||||||
title = event["title"]
|
|
||||||
location = event["location"]
|
|
||||||
date = event["date"]
|
|
||||||
date = dayNames[date.weekday()]+", "+str(date.day)+". "+str(date.month)+". "+str(date.year)+", "
|
|
||||||
time = event["time"]+"h"
|
|
||||||
event_html = []
|
|
||||||
event_html.append(f"<div class='date'>{date} {time}</div>")
|
|
||||||
if event["link"] != "":
|
|
||||||
event_html.append(f"<div class='title'><a href=\"{event['link']}\">{title}</a></div>")
|
|
||||||
else:
|
|
||||||
event_html.append(f"<div class='title'>{title}</div>")
|
|
||||||
if "https://" in location:
|
|
||||||
place,link = location.split("https://")
|
|
||||||
event_html.append(f"<div class='place'><a href=\"https://{link}\">@{place.strip()}</a></div>")
|
|
||||||
else:
|
|
||||||
event_html.append(f"<div class='place'>@{location.strip()}</div>")
|
|
||||||
|
|
||||||
if len(event["types"]) != 0:
|
|
||||||
types_list = "<div class='types'>"
|
|
||||||
last_item = event["types"][-1]
|
|
||||||
for t in event["types"]:
|
|
||||||
if typesNames.get(t) is not None:
|
|
||||||
types_list += typesNames.get(t)
|
|
||||||
if t != last_item:
|
|
||||||
types_list += ', '
|
|
||||||
else:
|
|
||||||
print(f"Unknown type {t}!")
|
|
||||||
types_list += "</div>"
|
|
||||||
event_html.append(types_list)
|
|
||||||
|
|
||||||
event_html = "".join(event_html)
|
|
||||||
events_html.append(f"\n<div class='event'>{event_html}</div>")
|
|
||||||
return events_html
|
|
||||||
|
|
||||||
def build_ical(events: list[dict]) -> str:
|
def build_ical(events: list[dict]) -> str:
|
||||||
today = datetime.today().now()
|
today = datetime.today().now()
|
||||||
# Header
|
|
||||||
events_ical = ""
|
events_ical = ""
|
||||||
with open("template/head.ical", "r") as file:
|
with open("template/head.ical", "r") as file:
|
||||||
events_ical += file.read()
|
events_ical += file.read()
|
||||||
# Events
|
|
||||||
for event in events:
|
for event in events:
|
||||||
title = event["title"]
|
title = event["title"]
|
||||||
location = event["location"]
|
location = event["location"]
|
||||||
@@ -95,85 +58,202 @@ def build_ical(events: list[dict]) -> str:
|
|||||||
url = event["link"]
|
url = event["link"]
|
||||||
|
|
||||||
uid = str(date.month).zfill(2) + str(date.day).zfill(2) + time[:2]
|
uid = str(date.month).zfill(2) + str(date.day).zfill(2) + time[:2]
|
||||||
date = str(date.year) + str(date.month).zfill(2) + str(date.day).zfill(2)
|
date_str = str(date.year) + str(date.month).zfill(2) + str(date.day).zfill(2)
|
||||||
created = str(today.year) + str(today.month).zfill(2) + str(today.day).zfill(2) + "T" + str(today.hour).zfill(2) + str(today.minute).zfill(2) + str(today.second).zfill(2) + "Z"
|
created = (
|
||||||
date = date + "T" + time.replace(":", "") + "00"
|
str(today.year)
|
||||||
|
+ str(today.month).zfill(2)
|
||||||
|
+ str(today.day).zfill(2)
|
||||||
|
+ "T"
|
||||||
|
+ str(today.hour).zfill(2)
|
||||||
|
+ str(today.minute).zfill(2)
|
||||||
|
+ str(today.second).zfill(2)
|
||||||
|
+ "Z"
|
||||||
|
)
|
||||||
|
date_str = date_str + "T" + time.replace(":", "") + "00"
|
||||||
|
|
||||||
event_template = ""
|
event_template_str = env.get_template("event.ical").render(
|
||||||
with open("template/event.ical", "r") as file:
|
UID=uid,
|
||||||
event_template += file.read()
|
CREATED=created,
|
||||||
event_template = event_template.replace("<!--UID-->", uid)
|
DATE=date_str,
|
||||||
event_template = event_template.replace("<!--CREATED-->", created)
|
TITLE=title,
|
||||||
event_template = event_template.replace("<!--DATE-->", date)
|
URL=url,
|
||||||
event_template = event_template.replace("<!--TITLE-->", title)
|
LOCATION=(
|
||||||
event_template = event_template.replace("<!--URL-->", url)
|
"DC Krov\\, Kraljice Marije 47\\, 6\\, Beograd\\, Serbia"
|
||||||
if location.startswith("DC Krov"):
|
if location.startswith("DC Krov")
|
||||||
event_template = event_template.replace("<!--LOCATION-->", "DC Krov\\, Kraljice Marije 47\\, 6\\, Beograd\\, Serbia")
|
else (
|
||||||
elif location.startswith("Matematički fakultet (Učionica 153)"):
|
"Matematički fakultet\\, Svetog Nikole 39\\, Beograd\\, Serbia"
|
||||||
event_template = event_template.replace("<!--LOCATION-->", "Matematički fakultet\\, Svetog Nikole 39\\, Beograd\\, Serbia")
|
if location.startswith("Matematički fakultet (Učionica 153)")
|
||||||
else:
|
else location
|
||||||
event_template = event_template.replace("<!--LOCATION-->", location)
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
events_ical += event_template_str
|
||||||
|
|
||||||
|
|
||||||
events_ical += event_template
|
|
||||||
# Footer
|
|
||||||
with open("template/end.ical", "r") as file:
|
with open("template/end.ical", "r") as file:
|
||||||
events_ical += file.read()
|
events_ical += file.read()
|
||||||
return events_ical
|
return events_ical
|
||||||
|
|
||||||
events = sorted(load_events("dogadjaji.csv"), key=lambda e: e["date"])
|
|
||||||
|
|
||||||
|
def render_page(template_name, output_path, context):
|
||||||
|
template = env.get_template(template_name)
|
||||||
|
with open(output_path, "w") as file:
|
||||||
|
file.write(template.render(context))
|
||||||
|
|
||||||
|
|
||||||
|
# Main execution
|
||||||
|
events = sorted(load_events("dogadjaji.csv"), key=lambda e: e["date"])
|
||||||
today = datetime.today().date()
|
today = datetime.today().date()
|
||||||
|
|
||||||
past_events = list(filter(lambda e: e["date"] <= today, events))
|
past_events = sorted(
|
||||||
past_events.reverse()
|
[e for e in events if e["date"] <= today], key=lambda e: e["date"], reverse=True
|
||||||
new_events = list(filter(lambda e: e["date"] >= today, events))
|
)
|
||||||
|
new_events = [e for e in events if e["date"] >= today]
|
||||||
|
|
||||||
|
sr_types = {k: v[0] for k, v in TYPES_DICT.items()}
|
||||||
|
en_types = {k: v[1] for k, v in TYPES_DICT.items()}
|
||||||
|
|
||||||
page_template = ""
|
# Build Serbian Pages
|
||||||
|
render_page(
|
||||||
|
"events-sr.html",
|
||||||
|
"pages/sr/events.html",
|
||||||
|
{
|
||||||
|
"lang": "sr",
|
||||||
|
"title": "Događaji",
|
||||||
|
"sr_link": "/events_archive",
|
||||||
|
"events_html": env.from_string("""
|
||||||
|
{% for event in events %}
|
||||||
|
<div class='event'>
|
||||||
|
<div class='date'>{{ event.date.strftime('%a, %d. %b. %Y') }}, {{ event.time }}h</div>
|
||||||
|
{% if event.link %}
|
||||||
|
<div class='title'><a href="{{ event.link }}">{{ event.title }}</a></div>
|
||||||
|
{% else %}
|
||||||
|
<div class='title'>{{ event.title }}</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if 'https://' in event.location %}
|
||||||
|
{% set place, link = event.location.split('https://') %}
|
||||||
|
<div class='place'><a href="https://{{ link }}" target='_blank'>@{{ place.strip() }}</a></div>
|
||||||
|
{% else %}
|
||||||
|
<div class='place'>@{{ event.location.strip() }}</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if event.types %}
|
||||||
|
<div class='types'>
|
||||||
|
{% for t in event.types %}
|
||||||
|
{{ types_names.get(t, t) }}{% if not loop.last %}, {% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
""").render(events=new_events, types_names=sr_types),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
sr_types = {}
|
render_page(
|
||||||
en_types = {}
|
"events-en.html",
|
||||||
|
"pages/en/events.html",
|
||||||
|
{
|
||||||
|
"lang": "en",
|
||||||
|
"title": "Events",
|
||||||
|
"sr_link": "/events_archive",
|
||||||
|
"events_html": env.from_string("""
|
||||||
|
{% for event in events %}
|
||||||
|
<div class='event'>
|
||||||
|
<div class='date'>{{ event.date.strftime('%a, %d. %b. %Y') }}, {{ event.time }}h</div>
|
||||||
|
{% if event.link %}
|
||||||
|
<div class='title'><a href="{{ event.link }}">{{ event.title }}</a></div>
|
||||||
|
{% else %}
|
||||||
|
<div class='title'>{{ event.title }}</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if 'https://' in event.location %}
|
||||||
|
{% set place, link = event.location.split('https://') %}
|
||||||
|
<div class='place'><a href="https://{{ link }}" target='_blank'>@{{ place.strip() }}</a></div>
|
||||||
|
{% else %}
|
||||||
|
<div class='place'>@{{ event.location.strip() }}</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if event.types %}
|
||||||
|
<div class='types'>
|
||||||
|
{% for t in event.types %}
|
||||||
|
{{ types_names.get(t, t) }}{% if not loop.last %}, {% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
""").render(events=new_events, types_names=en_types),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
for key, value_pair in TYPES_DICT.items():
|
# Build Archive Pages
|
||||||
sr_types[key] = value_pair[0]
|
render_page(
|
||||||
en_types[key] = value_pair[1]
|
"events_archive-sr.html",
|
||||||
|
"pages/sr/events_archive.html",
|
||||||
|
{
|
||||||
|
"lang": "sr",
|
||||||
|
"title": "Arhiva događaja",
|
||||||
|
"sr_link": "/events",
|
||||||
|
"events_html": env.from_string("""
|
||||||
|
{% for event in events %}
|
||||||
|
<div class='event'>
|
||||||
|
<div class='date'>{{ event.date.strftime('%a, %d. %b. %Y') }}, {{ event.time }}h</div>
|
||||||
|
{% if event.link %}
|
||||||
|
<div class='title'><a href="{{ event.link }}">{{ event.title }}</a></div>
|
||||||
|
{% else %}
|
||||||
|
<div class='title'>{{ event.title }}</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if 'https://' in event.location %}
|
||||||
|
{% set place, link = event.location.split('https://') %}
|
||||||
|
<div class='place'><a href="https://{{ link }}" target='_blank'>@{{ place.strip() }}</a></div>
|
||||||
|
{% else %}
|
||||||
|
<div class='place'>@{{ event.location.strip() }}</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if event.types %}
|
||||||
|
<div class='types'>
|
||||||
|
{% for t in event.types %}
|
||||||
|
{{ types_names.get(t, t) }}{% if not loop.last %}, {% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
""").render(events=past_events, types_names=sr_types),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
# Build Serbian Events page
|
render_page(
|
||||||
new_events_html = build_html(new_events, DAYS_SR, sr_types)
|
"events_archive-en.html",
|
||||||
with open("template/events-sr.html", "r") as file:
|
"pages/en/events_archive.html",
|
||||||
page_template = ([line for line in file])
|
{
|
||||||
|
"lang": "en",
|
||||||
with open("pages/sr/events.html", "w") as file:
|
"title": "Events archive",
|
||||||
file.writelines(page_template + new_events_html)
|
"sr_link": "/en/events",
|
||||||
|
"events_html": env.from_string("""
|
||||||
# Build English Events page
|
{% for event in events %}
|
||||||
new_events_html = build_html(new_events, DAYS_EN, en_types)
|
<div class='event'>
|
||||||
with open("template/events-en.html", "r") as file:
|
<div class='date'>{{ event.date.strftime('%a, %d. %b. %Y') }}, {{ event.time }}h</div>
|
||||||
page_template = ([line for line in file])
|
{% if event.link %}
|
||||||
|
<div class='title'><a href="{{ event.link }}">{{ event.title }}</a></div>
|
||||||
with open("pages/en/events.html", "w") as file:
|
{% else %}
|
||||||
file.writelines(page_template + new_events_html)
|
<div class='title'>{{ event.title }}</div>
|
||||||
|
{% endif %}
|
||||||
# Build Serbian Archive page
|
{% if 'https://' in event.location %}
|
||||||
past_events_html = build_html(past_events, DAYS_SR, sr_types)
|
{% set place, link = event.location.split('https://') %}
|
||||||
with open("template/events_archive-sr.html", "r") as file:
|
<div class='place'><a href="https://{{ link }}" target='_blank'>@{{ place.strip() }}</a></div>
|
||||||
page_template = ([line for line in file])
|
{% else %}
|
||||||
|
<div class='place'>@{{ event.location.strip() }}</div>
|
||||||
with open("pages/sr/events_archive.html", "w") as file:
|
{% endif %}
|
||||||
file.writelines(page_template + past_events_html)
|
{% if event.types %}
|
||||||
|
<div class='types'>
|
||||||
# Build English Archive page
|
{% for t in event.types %}
|
||||||
past_events_html = build_html(past_events, DAYS_EN, en_types)
|
{{ types_names.get(t, t) }}{% if not loop.last %}, {% endif %}
|
||||||
with open("template/events_archive-en.html", "r") as file:
|
{% endfor %}
|
||||||
page_template = ([line for line in file])
|
</div>
|
||||||
|
{% endif %}
|
||||||
with open("pages/en/events_archive.html", "w") as file:
|
</div>
|
||||||
file.writelines(page_template + past_events_html)
|
{% endfor %}
|
||||||
|
""").render(events=past_events, types_names=en_types),
|
||||||
new_events_ical = build_ical(new_events)
|
},
|
||||||
|
)
|
||||||
|
|
||||||
# Build ical
|
# Build ical
|
||||||
with open("site/events.ical", "w") as file:
|
with open("site/events.ical", "w") as file:
|
||||||
file.write(build_ical(new_events))
|
file.write(build_ical(new_events))
|
||||||
|
|
||||||
|
|||||||
8
pyproject.toml
Normal file
8
pyproject.toml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[tool.black]
|
||||||
|
line-length = 88
|
||||||
|
target-version = ['py312']
|
||||||
|
|
||||||
|
[tool.flake8]
|
||||||
|
max-line-length = 88
|
||||||
|
extend-ignore = "E203"
|
||||||
|
exclude = ".venv"
|
||||||
@@ -1,4 +1,9 @@
|
|||||||
cairosvg
|
cairosvg
|
||||||
markdown
|
black
|
||||||
|
feedgen
|
||||||
|
flake8
|
||||||
freetype-py
|
freetype-py
|
||||||
|
jinja2
|
||||||
|
markdown
|
||||||
|
pillow
|
||||||
python-dateutil
|
python-dateutil
|
||||||
|
|||||||
@@ -1,12 +1,7 @@
|
|||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html lang="sr">
|
<html lang="sr">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<!--
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
|
|
||||||
<!--
|
|
||||||
<pre>
|
|
||||||
|
|
||||||
*@@*
|
*@@*
|
||||||
*@@@@*
|
*@@@@*
|
||||||
*@@*
|
*@@*
|
||||||
@@ -26,80 +21,160 @@
|
|||||||
| | | | _|| | | _| | \| | | | | |_) | / _ \ | | / _ \
|
| | | | _|| | | _| | \| | | | | |_) | / _ \ | | / _ \
|
||||||
| |_| | |__| |___| |___| |\ | | | | _ < / ___ \| |___ / ___ \
|
| |_| | |__| |___| |___| |\ | | | | _ < / ___ \| |___ / ___ \
|
||||||
|____/|_____\____|_____|_| \_| |_| |_| \_\/_/ \_\_____/_/ \_\
|
|____/|_____\____|_____|_| \_| |_| |_| \_\/_/ \_\_____/_/ \_\
|
||||||
|
|
||||||
</pre>
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<link rel="stylesheet" href="/styles/reset.css">
|
<script>
|
||||||
<link rel="stylesheet" href="/styles/style.css">
|
(function () {
|
||||||
<link rel="stylesheet" href="/styles/deconference.css">
|
const theme = localStorage.getItem("theme");
|
||||||
<link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon">
|
const prefersDark = window.matchMedia(
|
||||||
<script src="/scripts/main.js" defer></script>
|
"(prefers-color-scheme: dark)",
|
||||||
<title>Dekonferencija Decentrala</title>
|
).matches;
|
||||||
<link rel="alternate" hreflang="en" href="/en/deconference" />
|
if (theme === "dark" || (!theme && prefersDark))
|
||||||
</head>
|
document.documentElement.classList.add("dark");
|
||||||
<body>
|
})();
|
||||||
<header>
|
</script>
|
||||||
<a id="logo" href="/"><img src="/img/logo-light.svg" alt="Logo"> Decentrala</a>
|
<meta charset="UTF-8" />
|
||||||
<button id="theme-switcher"></button>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<a class="lang" hreflang="en" href="/en/deconference">EN</a>
|
|
||||||
</header>
|
<link rel="stylesheet" href="/styles/reset.css" />
|
||||||
<main>
|
<link rel="stylesheet" href="/styles/style.css" />
|
||||||
<div class="page-wrap">
|
<link rel="stylesheet" href="/styles/deconference.css">
|
||||||
<div class='cover-wrap'><img src='/img/students_bug.jpg' alt='Studenti su nasli bug' /></div><h1>Dekonferencija</h1>
|
<link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon" />
|
||||||
|
<script src="/scripts/main.js"></script>
|
||||||
|
<title>Dekonferencija Decentrala</title>
|
||||||
|
<link rel="alternate" hreflang="sr" href="/en/deconference" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<a id="logo" href="/">
|
||||||
|
<img src="/img/logo-light.svg" alt="Logo" /> Decentrala
|
||||||
|
</a>
|
||||||
|
<button id="theme-switcher"></button>
|
||||||
|
<a class="lang" hreflang="en" href="/en/deconference">EN</a>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
|
||||||
|
<div class="page-wrap">
|
||||||
|
<div class='cover-wrap'><img src='/img/students_bug.jpg' alt='Studenti su nasli bug' /></div><h1>Dekonferencija</h1>
|
||||||
|
|
||||||
<h2 id="program"><a href="#program">Program</a></h2>
|
<h2 id="program"><a href="#program">Program</a></h2>
|
||||||
<p>11:00 Otvaranje<p>
|
<p>11:00 Otvaranje</p>
|
||||||
<p>12:00 <a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/cryptoparty">Cryptoparty</a><p>
|
<p>
|
||||||
<p>14:00 <a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/hakaton">Hakaton</a><p>
|
12:00
|
||||||
<p>16:00 <a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/lightningtalks">Lightning talks</a><p>
|
<a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/cryptoparty"
|
||||||
<p>18:00 Diskusije<p>
|
>Cryptoparty</a
|
||||||
<p>20:00 <a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/cryptoparty">Cryptoparty</a><p>
|
>
|
||||||
<p>22:00 Kraj<p>
|
</p>
|
||||||
|
<p>
|
||||||
|
14:00
|
||||||
|
<a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/hakaton">Hakaton</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
16:00
|
||||||
|
<a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/lightningtalks"
|
||||||
|
>Lightning talks</a
|
||||||
|
>
|
||||||
|
</p>
|
||||||
|
<p>18:00 Diskusije</p>
|
||||||
|
<p>
|
||||||
|
20:00
|
||||||
|
<a href="https://wiki.dmz.rs/en/decentrala/dogadjaji/cryptoparty"
|
||||||
|
>Cryptoparty</a
|
||||||
|
>
|
||||||
|
</p>
|
||||||
|
<p>22:00 Kraj</p>
|
||||||
|
|
||||||
<h2 id="what"><a href="#what">Šta?</a></h2>
|
<h2 id="what"><a href="#what">Šta?</a></h2>
|
||||||
<p>Dekonferencija je prva konferencija organizovana od strane <a href="https://dmz.rs">Decentrale</a>, Beogradskog hakerspejsa. Dekonferencija služi kao platforma za predstavljanje i diskusiju ideja decentralizacije u svim svojim oblicima.</p>
|
<p>
|
||||||
|
Dekonferencija je prva konferencija organizovana od strane
|
||||||
|
<a href="https://dmz.rs">Decentrale</a>, Beogradskog hakerspejsa.
|
||||||
|
Dekonferencija služi kao platforma za predstavljanje i diskusiju ideja
|
||||||
|
decentralizacije u svim svojim oblicima.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2 id="when-and-where"><a href="#when-and-where">Kad & Gde?</a></h2>
|
<h2 id="when-and-where"><a href="#when-and-where">Kad & Gde?</a></h2>
|
||||||
<p>Dekonferencija će se održati u nedelju, 15.-og Septembra, 2024, u Kulturnom Centru Magacin, na adresi <a href="https://osm.org/go/xf3Fz31te?node=1226456745">Kraljevića Marka 4-8, Beograd</a>. Veče pre, održaće se druženje povodom organizovanja konferencije u prostorijama <a href="https://dckrov.rs/">Društvenog Centra Krov</a>, na adresi <a href="https://osm.org/go/xf3HQQdIH">Kraljice Marije 47, Beograd</a>.</p>
|
<p>
|
||||||
|
Dekonferencija će se održati u nedelju, 15.-og Septembra, 2024, u Kulturnom
|
||||||
|
Centru Magacin, na adresi
|
||||||
|
<a href="https://osm.org/go/xf3Fz31te?node=1226456745"
|
||||||
|
>Kraljevića Marka 4-8, Beograd</a
|
||||||
|
>. Veče pre, održaće se druženje povodom organizovanja konferencije u
|
||||||
|
prostorijama <a href="https://dckrov.rs/">Društvenog Centra Krov</a>, na
|
||||||
|
adresi <a href="https://osm.org/go/xf3HQQdIH">Kraljice Marije 47, Beograd</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2 id="why"><a href="#why">Zašto?</a></h2>
|
<h2 id="why"><a href="#why">Zašto?</a></h2>
|
||||||
|
|
||||||
<p>Decentrala je osnovana od strane male grupe entuzijasta udružene oko ideje decentralizacije tehnologije. Poslednjih godinu i po, organizovali smo više od 160 događaja—predavanja, radionica, diskusija, hakatona—sa ciljem demokratizacije tehnološkog znanja i edukacije o privatnosti, open source principa, prava na popravku (i kako popraviti), digitalna svojina, i pravo korišćenja. Od prvog dana, naš pristup je bio da informišemo pojedince o alternativama umesto da im namećemo naše mišljenje.</p>
|
<p>
|
||||||
|
Decentrala je osnovana od strane male grupe entuzijasta udružene oko ideje
|
||||||
|
decentralizacije tehnologije. Poslednjih godinu i po, organizovali smo više od
|
||||||
|
160 događaja—predavanja, radionica, diskusija, hakatona—sa ciljem
|
||||||
|
demokratizacije tehnološkog znanja i edukacije o privatnosti, open source
|
||||||
|
principa, prava na popravku (i kako popraviti), digitalna svojina, i pravo
|
||||||
|
korišćenja. Od prvog dana, naš pristup je bio da informišemo pojedince o
|
||||||
|
alternativama umesto da im namećemo naše mišljenje.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Vremenom, angažovanjem sa raznovrsnim posetiocima, od kojih su mnogi iz ne-tehničkih sfera, shvatili smo da decentralizacija obuhvata više od samo "otvorene tehnologije." Mnogi aktivisti i organizacije se danas zalažu za različite oblike decentralizacije. Zato, smatramo da su dobrodošle priče decentralizacije iz različitih perspektiva.</p>
|
<p>
|
||||||
|
Vremenom, angažovanjem sa raznovrsnim posetiocima, od kojih su mnogi iz
|
||||||
|
ne-tehničkih sfera, shvatili smo da decentralizacija obuhvata više od samo
|
||||||
|
"otvorene tehnologije." Mnogi aktivisti i organizacije se danas zalažu za
|
||||||
|
različite oblike decentralizacije. Zato, smatramo da su dobrodošle priče
|
||||||
|
decentralizacije iz različitih perspektiva.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2 id="who"><a href="#who">Ko?</a></h2>
|
<h2 id="who"><a href="#who">Ko?</a></h2>
|
||||||
|
|
||||||
<p>Dekonferencija je otvorena platforma za sve zainteresovane za diskusiju, demonstraciju, ili istraživanje decentralizacije. Možete registrovati vaš događaj slanjem email-a na <a href="mailto:dekonferencija@dmz.rs">dekonferencija@dmz.rs</a> do dana Dekonferencije (15.-ti Septembar).</p>
|
<p>
|
||||||
|
Dekonferencija je otvorena platforma za sve zainteresovane za diskusiju,
|
||||||
|
demonstraciju, ili istraživanje decentralizacije. Možete registrovati vaš
|
||||||
|
događaj slanjem email-a na
|
||||||
|
<a href="mailto:dekonferencija@dmz.rs">dekonferencija@dmz.rs</a> do dana
|
||||||
|
Dekonferencije (15.-ti Septembar).
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Osvežićemo ovaj deo kako se teme događaja potvrde.</p>
|
<p>Osvežićemo ovaj deo kako se teme događaja potvrde.</p>
|
||||||
|
|
||||||
<h2 id="how"><a href="#how">Kako?</a></h2>
|
<h2 id="how"><a href="#how">Kako?</a></h2>
|
||||||
|
|
||||||
<p>Dekonferencija je finansirana od strane ličnih sredstava organizatora. Kao i sve aktivnosti Decentrale, Dekonferencija je besplatna svima. Nažalost, nismo u stanju da pružimo subvencije predavačima.</p>
|
<p>
|
||||||
|
Dekonferencija je finansirana od strane ličnih sredstava organizatora. Kao i
|
||||||
|
sve aktivnosti Decentrale, Dekonferencija je besplatna svima. Nažalost, nismo
|
||||||
|
u stanju da pružimo subvencije predavačima.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Decentrala prihvata donacije isključivo od fizičkih lica.</p>
|
<p>Decentrala prihvata donacije isključivo od fizičkih lica.</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</main>
|
|
||||||
<footer>
|
</main>
|
||||||
<button id="sections-button" opened="false"><img src="/img/strelica-closed-light.svg" alt="OpenMenu"></button>
|
<footer>
|
||||||
<nav>
|
<button class="hamburger closed">
|
||||||
<a href="/events">Događaji</a>
|
<img src="/img/strelica-closed-light.svg" alt="Menu" />
|
||||||
<a href="/services">Servisi</a>
|
</button>
|
||||||
<a href="/statute">Statut</a>
|
<nav class="menu">
|
||||||
<a href="/about">O nama</>
|
|
||||||
<a class="account" href="/account">Nalog</a>
|
<a href="/events">Događaji</a>
|
||||||
<a href="/support">Podrška</a>
|
<a href="/services">Servisi</a>
|
||||||
</nav>
|
<a href="/statute">Statut</a>
|
||||||
<span class="links">
|
<a href="/about">O nama</a>
|
||||||
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/"><img src="/img/cc-light.svg" alt="CreativeCommons"></a>
|
<a href="/account">Nalog</a>
|
||||||
<a href="/webring"><img src="/img/w-light.svg" alt="Webring"></a>
|
<a href="/support">Podrška</a>
|
||||||
<a href="https://gitea.dmz.rs/Decentrala/website"><img src="/img/git-light.svg" alt="SourceCode"></a>
|
</nav>
|
||||||
<a href="https://balkan.fedive.rs/@decentrala"><img src="/img/mastodon-light.svg" alt="Mastodon"></a>
|
<span class="links">
|
||||||
</span>
|
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
|
||||||
</footer>
|
<img src="/img/cc-light.svg" alt="CreativeCommons" />
|
||||||
</body>
|
</a>
|
||||||
</html>
|
<a href="/webring">
|
||||||
|
<img src="/img/w-light.svg" alt="Webring" />
|
||||||
|
</a>
|
||||||
|
<a href="https://gitea.dmz.rs/Decentrala/website">
|
||||||
|
<img src="/img/git-light.svg" alt="SourceCode" />
|
||||||
|
</a>
|
||||||
|
<a href="https://balkan.fedive.rs/@decentrala">
|
||||||
|
<img src="/img/mastodon-light.svg" alt="Mastodon" />
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1,207 +1,275 @@
|
|||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html lang="sr">
|
<html lang="sr">
|
||||||
|
<head>
|
||||||
<head>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta charset="UTF-8" />
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>Linux Install Fest 2025</title>
|
<title>Linux Install Fest 2025</title>
|
||||||
<style>
|
<style>
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Iosevka";
|
font-family: "Iosevka";
|
||||||
src: url('/font/iosevka-regular.woff') format('woff');
|
src: url("/font/iosevka-regular.woff") format("woff");
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Lobster";
|
font-family: "Lobster";
|
||||||
src: url('/font/Lobster-Regular.ttf') format('truetype');
|
src: url("/font/Lobster-Regular.ttf") format("truetype");
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
background-color: #082142;
|
background-color: #082142;
|
||||||
color: #FFF;
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
padding: 1rem;
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: 1000px;
|
||||||
|
font-family: "Iosevka", Arial, Helvetica, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
a,
|
||||||
|
a:visited,
|
||||||
|
a:hover {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-family: "Lobster", sans-serif;
|
||||||
|
font-size: 5rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-family: "Lobster", sans-serif;
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 650px) {
|
||||||
|
h1 {
|
||||||
|
font-size: 4rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
main {
|
main {
|
||||||
padding: 1rem;
|
padding: 0.5rem;
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 1000px;
|
|
||||||
font-family: "Iosevka", Arial, Helvetica, sans-serif;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
a,
|
@media (max-width: 500px) {
|
||||||
a:visited,
|
main {
|
||||||
a:hover {
|
padding: 0.2rem;
|
||||||
color: #FFF;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
font-family: "Lobster", sans-serif;
|
font-size: 3rem;
|
||||||
font-size: 5rem;
|
|
||||||
text-align: center;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
font-family: "Lobster", sans-serif;
|
font-size: 1.5rem;
|
||||||
font-size: 2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
font-size: 1.1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 650px) {
|
|
||||||
h1 {
|
|
||||||
font-size: 4rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
main {
|
|
||||||
padding: 0.5rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@media (max-width: 500px) {
|
|
||||||
main {
|
|
||||||
padding: 0.2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: 3rem;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.5rem;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<main>
|
<main>
|
||||||
<h1>Linux Install Fest</h1>
|
<h1>Linux Install Fest</h1>
|
||||||
|
|
||||||
<h2>Gde i kad</h2>
|
<h2>Gde i kad</h2>
|
||||||
|
|
||||||
<p>Linux Install Fest će se održati 9. decembra 2025 godine u učionici JAG3 Matematičkog fakulteta, na adresi
|
<p>
|
||||||
<a href="https://www.openstreetmap.org/node/3807078606">Jagićeva 5, Beograd</a>. Ulazak u učionicu је moguć od 18h do 21h.</p>
|
Linux Install Fest će se održati 9. decembra 2025 godine u učionici JAG3
|
||||||
|
Matematičkog fakulteta, na adresi
|
||||||
|
<a href="https://www.openstreetmap.org/node/3807078606"
|
||||||
|
>Jagićeva 5, Beograd</a
|
||||||
|
>. Ulazak u učionicu је moguć od 18h do 21h.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Jagićeva ulica se nalazi između stanice <a href="https://www.openstreetmap.org/node/6670711291"><em>Pijaca
|
<p>
|
||||||
Đeram</em></a> na kojoj staju tramvaji 5, 6, 7L
|
Jagićeva ulica se nalazi između stanice
|
||||||
i 14, i
|
<a href="https://www.openstreetmap.org/node/6670711291"
|
||||||
stanice <a href="https://www.openstreetmap.org/node/1693535022"><em>Crveni krst</em></a> na kojoj staju
|
><em>Pijaca Đeram</em></a
|
||||||
autobusi 21 i 83, kao i trolebusi 19, 22 i 29.</p>
|
>
|
||||||
|
na kojoj staju tramvaji 5, 6, 7L i 14, i stanice
|
||||||
|
<a href="https://www.openstreetmap.org/node/1693535022"
|
||||||
|
><em>Crveni krst</em></a
|
||||||
|
>
|
||||||
|
na kojoj staju autobusi 21 i 83, kao i trolebusi 19, 22 i 29.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2>Plan programa</h2>
|
<h2>Plan programa</h2>
|
||||||
|
|
||||||
<p>Cilj okupljanja je da zainteresovanima za Linux pomognemo pri instalaciji Linux operativnog sistema na
|
<p>
|
||||||
laptopove. Na događaju će biti prisutno više osoba koje imaju višegodišnje iskustvo u radu sa Linuxom. Pored
|
Cilj okupljanja je da zainteresovanima za Linux pomognemo pri
|
||||||
toga, u zavisnosti od zainteresovanosti prisutnih, mogu se održati i kratke obuke vezane za komandnu liniju,
|
instalaciji Linux operativnog sistema na laptopove. Na događaju će biti
|
||||||
git, web servise, C programiranje, itd...</p>
|
prisutno više osoba koje imaju višegodišnje iskustvo u radu sa Linuxom.
|
||||||
|
Pored toga, u zavisnosti od zainteresovanosti prisutnih, mogu se održati
|
||||||
|
i kratke obuke vezane za komandnu liniju, git, web servise, C
|
||||||
|
programiranje, itd...
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Nakon 21h, druženje možemo nastaviti u nekom od obližnjih lokala.</p>
|
<p>Nakon 21h, druženje možemo nastaviti u nekom od obližnjih lokala.</p>
|
||||||
|
|
||||||
<h2>Linux distribucije</h2>
|
<h2>Linux distribucije</h2>
|
||||||
|
|
||||||
<p>Linux je jezgro operativnog sistema, na koji se instaliraju drugi programi. Sve to zajedno čini određenu
|
<p>
|
||||||
<em>Linux distribuciju</em>. Postoji mnogo distribucija, ali mi preporučujemo one sa dugom tradicijom poput
|
Linux je jezgro operativnog sistema, na koji se instaliraju drugi
|
||||||
sledećih:
|
programi. Sve to zajedno čini određenu <em>Linux distribuciju</em>.
|
||||||
</p>
|
Postoji mnogo distribucija, ali mi preporučujemo one sa dugom tradicijom
|
||||||
|
poput sledećih:
|
||||||
|
</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>Debian</strong> distribucija je verovatno najprimerenija za Linux početnike. Poznati derivati
|
<li>
|
||||||
Debiana su <strong>Ubuntu</strong>, <strong>Mint</strong> i <strong>Zorin</strong>.
|
<strong>Debian</strong> distribucija je verovatno najprimerenija za
|
||||||
</li>
|
Linux početnike. Poznati derivati Debiana su <strong>Ubuntu</strong>,
|
||||||
<li><strong>Fedora</strong> je takođe pogodna za Linux početnike. Razlikuje se od Debian
|
<strong>Mint</strong> i <strong>Zorin</strong>.
|
||||||
distribucije, po bržem izlasku novih verzija, što u praksi znači da korisnici imaju svežije
|
</li>
|
||||||
verzije programa.</li>
|
<li>
|
||||||
<li><strong>Arch</strong> je Linux distribucija koja dozvoljava korisniku da lako konfiguriše sve delove
|
<strong>Fedora</strong> je takođe pogodna za Linux početnike.
|
||||||
sistema. Ova distribucija je namenjena osobama sa značajnim Linux iskustvom.</li>
|
Razlikuje se od Debian distribucije, po bržem izlasku novih verzija,
|
||||||
</ul>
|
što u praksi znači da korisnici imaju svežije verzije programa.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>Arch</strong> je Linux distribucija koja dozvoljava korisniku
|
||||||
|
da lako konfiguriše sve delove sistema. Ova distribucija je namenjena
|
||||||
|
osobama sa značajnim Linux iskustvom.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<p>Ako ste početnik, i niste se odlučili koju distribuciju želite da instalirate, preporučujemo vam Fedoru ili Debian.
|
<p>
|
||||||
Bez obzira koju distribuciju posedujete, moći ćete da pokrenete sve programe namenjene za Linux.
|
Ako ste početnik, i niste se odlučili koju distribuciju želite da
|
||||||
</p>
|
instalirate, preporučujemo vam Fedoru ili Debian. Bez obzira koju
|
||||||
|
distribuciju posedujete, moći ćete da pokrenete sve programe namenjene
|
||||||
|
za Linux.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2>End of 10</h2>
|
<h2>End of 10</h2>
|
||||||
|
|
||||||
<p>Ovogodišnji Linux Install Fest, organizuje se u sklopu globalne <a href="https://endof10.org/">End of 10</a>
|
<p>
|
||||||
kampanje, koja promoviše Linux operativni sistem kao zamenu za Windows 10.</p>
|
Ovogodišnji Linux Install Fest, organizuje se u sklopu globalne
|
||||||
|
<a href="https://endof10.org/">End of 10</a> kampanje, koja promoviše
|
||||||
|
Linux operativni sistem kao zamenu za Windows 10.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Već duže vreme Windows
|
<p>
|
||||||
operativni sistem postaje sve više neprijateljski prema korisnicima. Nasuprot tome,
|
Već duže vreme Windows operativni sistem postaje sve više neprijateljski
|
||||||
mnoge Linux distribucije su maksimalno unapredile korisnički doživljaj, te danas
|
prema korisnicima. Nasuprot tome, mnoge Linux distribucije su maksimalno
|
||||||
možemo tvrditi da Linux omogućava značajno ugodniji rad, bez obzira na korisnikovo tehničko znanje.</p>
|
unapredile korisnički doživljaj, te danas možemo tvrditi da Linux
|
||||||
|
omogućava značajno ugodniji rad, bez obzira na korisnikovo tehničko
|
||||||
|
znanje.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Windows nameće korisnicima funkcionalnosti koje korisnici ne žele da koriste, kao što
|
<p>
|
||||||
su: cloud integracije, AI, reklame, obavezni nalozi, i slično. Ove
|
Windows nameće korisnicima funkcionalnosti koje korisnici ne žele da
|
||||||
funkcionalnosti služe pre svega za povećanje Microsoftovog profita, a nemaju benefita za većinu krajnjih
|
koriste, kao što su: cloud integracije, AI, reklame, obavezni nalozi, i
|
||||||
korisnika. Takođe, osnovni programi poput kalendara, kalkulatora ili editora teksta, postali su spori
|
slično. Ove funkcionalnosti služe pre svega za povećanje Microsoftovog
|
||||||
i puni bug-ova.
|
profita, a nemaju benefita za većinu krajnjih korisnika. Takođe, osnovni
|
||||||
Sa beskorisnim funkcionalnostima, Windows svake godine postaje sve više zahtevan i
|
programi poput kalendara, kalkulatora ili editora teksta, postali su
|
||||||
iziskuje kupovinu boljeg hardvera, što dovodi do povećanja elektronskog otpada. Nasuprot Windowsu, i
|
spori i puni bug-ova. Sa beskorisnim funkcionalnostima, Windows svake
|
||||||
najnovije Linux distribucije rade veoma performantno na računarima starijim od deceniju.</p>
|
godine postaje sve više zahtevan i iziskuje kupovinu boljeg hardvera,
|
||||||
|
što dovodi do povećanja elektronskog otpada. Nasuprot Windowsu, i
|
||||||
|
najnovije Linux distribucije rade veoma performantno na računarima
|
||||||
|
starijim od deceniju.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Izbor operativnog sistema nije više samo tehnička odluka, već i ekološki stav.</p>
|
<p>
|
||||||
|
Izbor operativnog sistema nije više samo tehnička odluka, već i ekološki
|
||||||
|
stav.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2>Načini instalacije</h2>
|
<h2>Načini instalacije</h2>
|
||||||
|
|
||||||
<p>Linux možemo instalirati na tri načina:</p>
|
<p>Linux možemo instalirati na tri načina:</p>
|
||||||
|
|
||||||
<ol>
|
<ol>
|
||||||
<li><strong>Unutar virtualne mašine na Windows-u</strong>. Na ovaj način korisnik zadržava svoj postojeći
|
<li>
|
||||||
operativni sistem i
|
<strong>Unutar virtualne mašine na Windows-u</strong>. Na ovaj način
|
||||||
podatke na njemu. Linux u virtualnoj mašini će biti značajno sporiji u odnosu na instalaciju bez
|
korisnik zadržava svoj postojeći operativni sistem i podatke na njemu.
|
||||||
virtualizacije.
|
Linux u virtualnoj mašini će biti značajno sporiji u odnosu na
|
||||||
</li>
|
instalaciju bez virtualizacije.
|
||||||
<li><strong>Pored postojećeg operativnog sistema</strong>. U slučaju da je moguće neku od vaših
|
</li>
|
||||||
particija umanjiti
|
<li>
|
||||||
(<em>partition shrink</em>), i osloboditi barem 10GB prostora, može se instalirati Linux operativni
|
<strong>Pored postojećeg operativnog sistema</strong>. U slučaju da je
|
||||||
sistem pored Windows-a. Prilikom pokretanja računara, korisnik će moći da bira da li želi da pokrene
|
moguće neku od vaših particija umanjiti (<em>partition shrink</em>), i
|
||||||
Windows ili Linux. Pri ovakvoj instalaciji postoji određeni rizik da će neko od narednih ažuriranja
|
osloboditi barem 10GB prostora, može se instalirati Linux operativni
|
||||||
Windowsa resetovati podešavanja bootloader-a, nakon čega je potrebna mala intervencija da bi
|
sistem pored Windows-a. Prilikom pokretanja računara, korisnik će moći
|
||||||
Linux sistem bio ponovo dostupan.</li>
|
da bira da li želi da pokrene Windows ili Linux. Pri ovakvoj
|
||||||
|
instalaciji postoji određeni rizik da će neko od narednih ažuriranja
|
||||||
|
Windowsa resetovati podešavanja bootloader-a, nakon čega je potrebna
|
||||||
|
mala intervencija da bi Linux sistem bio ponovo dostupan.
|
||||||
|
</li>
|
||||||
|
|
||||||
<li><strong>Kompletnim uklanjanjem Windows sistema</strong>. Na mestu Windows particije,
|
<li>
|
||||||
biće postavljena nova particija sa Linux distribucijom. Dodatne particije koje postoje mogu, i ne moraju biti uklonjene.</li>
|
<strong>Kompletnim uklanjanjem Windows sistema</strong>. Na mestu
|
||||||
</ol>
|
Windows particije, biće postavljena nova particija sa Linux
|
||||||
|
distribucijom. Dodatne particije koje postoje mogu, i ne moraju biti
|
||||||
|
uklonjene.
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
<h2>Pre dolaska</h2>
|
<h2>Pre dolaska</h2>
|
||||||
|
|
||||||
<p>Da bi instalacija bila efikasna, pre dolaska na Linux Instal Fest neophodno je da napravite <em>backup</em>
|
<p>
|
||||||
podataka sa sistemske particije ako se odlučujete za drugu ili treću opciju instalacije. Ako posedujete dve
|
Da bi instalacija bila efikasna, pre dolaska na Linux Instal Fest
|
||||||
particije (na primer, C i D), podatke sa sistemske particije (C:) koje želite da zadržite prebacite na nesistemsku particiju (D:).
|
neophodno je da napravite <em>backup</em> podataka sa sistemske
|
||||||
Ako nemate dodatnu particiju, možete iskoristiti USB fleš. Obratite pažnju na datoteke unutar korisničkog direkotrijuma (<em>Desktop,
|
particije ako se odlučujete za drugu ili treću opciju instalacije. Ako
|
||||||
Downloads, Documents,...</em>), a iz pretraživača izvezite bookmarkove i lozinke.</p>
|
posedujete dve particije (na primer, C i D), podatke sa sistemske
|
||||||
|
particije (C:) koje želite da zadržite prebacite na nesistemsku
|
||||||
|
particiju (D:). Ako nemate dodatnu particiju, možete iskoristiti USB
|
||||||
|
fleš. Obratite pažnju na datoteke unutar korisničkog direkotrijuma (<em
|
||||||
|
>Desktop, Downloads, Documents,...</em
|
||||||
|
>), a iz pretraživača izvezite bookmarkove i lozinke.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Takođe, pre dolaska možete se upoznati sa izgledom i načinom funkcionisanja različitih Linux distubucija.
|
<p>
|
||||||
Neke Linux distribucije možete probati kroz pretraživač, bez bilo kakve instalacije, na sajtu
|
Takođe, pre dolaska možete se upoznati sa izgledom i načinom
|
||||||
<a href="https://distrosea.com/">DistroSea</a> (ponekad je potrebno sačekati kratko vreme da se oslobode
|
funkcionisanja različitih Linux distubucija. Neke Linux distribucije
|
||||||
resursi na sajtu). Imajte na umu da je operativni sistem na ovom sajtu višestruko sporiji od sistema koji je
|
možete probati kroz pretraživač, bez bilo kakve instalacije, na sajtu
|
||||||
instaliran na vašem računaru.
|
<a href="https://distrosea.com/">DistroSea</a> (ponekad je potrebno
|
||||||
</p>
|
sačekati kratko vreme da se oslobode resursi na sajtu). Imajte na umu da
|
||||||
|
je operativni sistem na ovom sajtu višestruko sporiji od sistema koji je
|
||||||
|
instaliran na vašem računaru.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Pre dolaska napunite baterije loptopova. Obevezno ponesite i punjač.</p>
|
<p>
|
||||||
|
Pre dolaska napunite baterije loptopova. Obevezno ponesite i punjač.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2>Organizator</h2>
|
<h2>Organizator</h2>
|
||||||
|
|
||||||
<p>Organizator događaja je <a href="https://dmz.rs/">Decentrala</a> - grupa entuzijasta okupljena oko ideja
|
<p>
|
||||||
decentralizacije i slobodnog širenja znanja. Do sada smo organizovali više od <a
|
Organizator događaja je <a href="https://dmz.rs/">Decentrala</a> - grupa
|
||||||
href="https://dmz.rs/events_archive">300 događaja</a>, a naredne događaje redovno najavljujemo na
|
entuzijasta okupljena oko ideja decentralizacije i slobodnog širenja
|
||||||
stranici <a href="https://dmz.rs/events">Događaji</a>.
|
znanja. Do sada smo organizovali više od
|
||||||
</p>
|
<a href="https://dmz.rs/events_archive">300 događaja</a>, a naredne
|
||||||
|
događaje redovno najavljujemo na stranici
|
||||||
|
<a href="https://dmz.rs/events">Događaji</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>U narednom periodu, na istoj lokaciji (učionica JAG3) biće održano još dva događaja za Linux početnike:</p>
|
<p>
|
||||||
<ul>
|
U narednom periodu, na istoj lokaciji (učionica JAG3) biće održano još
|
||||||
<li><strong>Utorak 16. decembar</strong> - Uvod u Linux komandnu liniju</li>
|
dva događaja za Linux početnike:
|
||||||
<li><strong>Utorak 23. decembar</strong> - Uvod u Git</li>
|
</p>
|
||||||
</ul>
|
<ul>
|
||||||
<p>Događaji počinju od 18h.</p>
|
<li>
|
||||||
|
<strong>Utorak 16. decembar</strong> - Uvod u Linux komandnu liniju
|
||||||
<h2>Ponovo</h2>
|
</li>
|
||||||
<p>Na Linux install fest možete doneti neispravne uređje: laptopove, telefone, desktop računare, monitore....
|
<li><strong>Utorak 23. decembar</strong> - Uvod u Git</li>
|
||||||
Mi ćemo ih tokom januara isporočuiti organizaciji <a href="https://ponovo.rs/">Ponovo</a> u Kikindi.
|
</ul>
|
||||||
Ova organizacija će popraviti ove uređaje i time sprečiti uvećavanje elektronskog otpada.</p>
|
<p>Događaji počinju od 18h.</p>
|
||||||
|
|
||||||
|
<h2>Ponovo</h2>
|
||||||
|
<p>
|
||||||
|
Na Linux install fest možete doneti neispravne uređje: laptopove,
|
||||||
|
telefone, desktop računare, monitore.... Mi ćemo ih tokom januara
|
||||||
|
isporočuiti organizaciji <a href="https://ponovo.rs/">Ponovo</a> u
|
||||||
|
Kikindi. Ova organizacija će popraviti ove uređaje i time sprečiti
|
||||||
|
uvećavanje elektronskog otpada.
|
||||||
|
</p>
|
||||||
</main>
|
</main>
|
||||||
</body>
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
</html>
|
|
||||||
@@ -1,157 +1,275 @@
|
|||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html lang="sr">
|
<html lang="sr">
|
||||||
|
<head>
|
||||||
<head>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta charset="UTF-8" />
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>Linux Install Fest 2025</title>
|
<title>Linux Install Fest 2025</title>
|
||||||
<style>
|
<style>
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Iosevka";
|
font-family: "Iosevka";
|
||||||
src: url('/font/iosevka-regular.woff') format('woff');
|
src: url("/font/iosevka-regular.woff") format("woff");
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Lobster";
|
font-family: "Lobster";
|
||||||
src: url('/font/Lobster-Regular.ttf') format('truetype');
|
src: url("/font/Lobster-Regular.ttf") format("truetype");
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
background-color: #082142;
|
background-color: #082142;
|
||||||
color: #FFF;
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
padding: 1rem;
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: 1000px;
|
||||||
|
font-family: "Iosevka", Arial, Helvetica, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
a,
|
||||||
|
a:visited,
|
||||||
|
a:hover {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-family: "Lobster", sans-serif;
|
||||||
|
font-size: 5rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-family: "Lobster", sans-serif;
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 650px) {
|
||||||
|
h1 {
|
||||||
|
font-size: 4rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
main {
|
main {
|
||||||
padding: 1rem;
|
padding: 0.5rem;
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 1000px;
|
|
||||||
font-family: "Iosevka", Arial, Helvetica, sans-serif;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
a,
|
@media (max-width: 500px) {
|
||||||
a:visited,
|
main {
|
||||||
a:hover {
|
padding: 0.2rem;
|
||||||
color: #FFF;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
font-family: "Lobster", sans-serif;
|
font-size: 3rem;
|
||||||
font-size: 5rem;
|
|
||||||
text-align: center;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
font-family: "Lobster", sans-serif;
|
font-size: 1.5rem;
|
||||||
font-size: 2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
font-size: 1.1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 650px) {
|
|
||||||
h1 {
|
|
||||||
font-size: 4rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
main {
|
|
||||||
padding: 0.5rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@media (max-width: 500px) {
|
|
||||||
main {
|
|
||||||
padding: 0.2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: 3rem;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.5rem;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<main>
|
<main>
|
||||||
<h1>Linux Install Fest</h1>
|
<h1>Linux Install Fest</h1>
|
||||||
|
|
||||||
<h2>Where and when</h2>
|
<h2>Where and when</h2>
|
||||||
|
|
||||||
<p>Linux Install Fest will be held on December 9, 2025 in the JAG3 classroom of the Faculty of Mathematics, at
|
<p>
|
||||||
<a href="https://www.openstreetmap.org/node/3807078606">Jagićeva 5, Belgrade</a>. Entry to the classroom is possible from 6 pm to 9 pm.</p>
|
Linux Install Fest will be held on December 9, 2025 in the JAG3
|
||||||
|
classroom of the Faculty of Mathematics, at
|
||||||
|
<a href="https://www.openstreetmap.org/node/3807078606"
|
||||||
|
>Jagićeva 5, Belgrade</a
|
||||||
|
>. Entry to the classroom is possible from 6 pm to 9 pm.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Jagićeva street is located between the <a href="https://www.openstreetmap.org/node/6670711291"><em>Pijaca
|
<p>
|
||||||
Đeram</em></a> station where trams 5, 6, 7L and 14 stop, and the <a href="https://www.openstreetmap.org/node/1693535022"><em>Crveni krst</em></a> station where buses 21 and 83 stop, as well as trolleybuses 19, 22 and 29.</p>
|
Jagićeva street is located between the
|
||||||
|
<a href="https://www.openstreetmap.org/node/6670711291"
|
||||||
|
><em>Pijaca Đeram</em></a
|
||||||
|
>
|
||||||
|
station where trams 5, 6, 7L and 14 stop, and the
|
||||||
|
<a href="https://www.openstreetmap.org/node/1693535022"
|
||||||
|
><em>Crveni krst</em></a
|
||||||
|
>
|
||||||
|
station where buses 21 and 83 stop, as well as trolleybuses 19, 22 and
|
||||||
|
29.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2>Program schedule</h2>
|
<h2>Program schedule</h2>
|
||||||
|
|
||||||
<p>The goal of the gathering is to help interested install the Linux operating system on laptops. Several people with working Linux experience will be present at the event. In addition, depending on the interest of those present, short trainings related to the command line, git, web services, C programming, etc. can be held.</p>
|
<p>
|
||||||
|
The goal of the gathering is to help interested install the Linux
|
||||||
|
operating system on laptops. Several people with working Linux
|
||||||
|
experience will be present at the event. In addition, depending on the
|
||||||
|
interest of those present, short trainings related to the command line,
|
||||||
|
git, web services, C programming, etc. can be held.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>After 9 p.m., we can continue socializing in one of the nearby bars.</p>
|
<p>
|
||||||
|
After 9 p.m., we can continue socializing in one of the nearby bars.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2>Linux distributions</h2>
|
<h2>Linux distributions</h2>
|
||||||
|
|
||||||
<p>Linux is the core of the operating system, on which other programs are installed. All of these together make up a particular <em>Linux distribution</em>. There are many distributions, but we recommend the ones with a long tradition like the following:
|
<p>
|
||||||
</p>
|
Linux is the core of the operating system, on which other programs are
|
||||||
|
installed. All of these together make up a particular
|
||||||
|
<em>Linux distribution</em>. There are many distributions, but we
|
||||||
|
recommend the ones with a long tradition like the following:
|
||||||
|
</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>The Debian</strong> distribution is probably the most suitable for Linux beginners. Known derivatives of Debian are Ubuntu, Mint and Zorin.</li>
|
<li>
|
||||||
<li><strong>Fedora</strong> is also suitable for Linux beginners. It differs from the Debian distribution by the faster release of new versions, which in practice means that users have newer versions of the program.</li>
|
<strong>The Debian</strong> distribution is probably the most suitable
|
||||||
<li><strong>Arch</strong> is a Linux distribution that allows the user to easily configure all parts of the system. This distribution is intended for people with significant Linux experience.</li>
|
for Linux beginners. Known derivatives of Debian are Ubuntu, Mint and
|
||||||
</ul>
|
Zorin.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>Fedora</strong> is also suitable for Linux beginners. It
|
||||||
|
differs from the Debian distribution by the faster release of new
|
||||||
|
versions, which in practice means that users have newer versions of
|
||||||
|
the program.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>Arch</strong> is a Linux distribution that allows the user to
|
||||||
|
easily configure all parts of the system. This distribution is
|
||||||
|
intended for people with significant Linux experience.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<p>If you are a beginner and haven't decided which distribution you want to install, we recommend Fedora or Debian. Regardless of which distribution you have, you will be able to run all programs intended for Linux.</p>
|
<p>
|
||||||
|
If you are a beginner and haven't decided which distribution you want to
|
||||||
|
install, we recommend Fedora or Debian. Regardless of which distribution
|
||||||
|
you have, you will be able to run all programs intended for Linux.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2>End of 10</h2>
|
<h2>End of 10</h2>
|
||||||
|
|
||||||
<p>This year's Linux Install Fest is organized as part of the global <a href="https://endof10.org/">End of 10</a>
|
<p>
|
||||||
campaign, which promotes the Linux operating system as a replacement for Windows 10.</p>
|
This year's Linux Install Fest is organized as part of the global
|
||||||
|
<a href="https://endof10.org/">End of 10</a> campaign, which promotes
|
||||||
|
the Linux operating system as a replacement for Windows 10.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>For a long time now, the Windows operating system has become increasingly unfriendly to users. On the contrary, many Linux distributions have improved the user experience to the maximum, and today we can claim that Linux enables significantly more pleasant work, regardless of the user's technical knowledge.</p>
|
<p>
|
||||||
|
For a long time now, the Windows operating system has become
|
||||||
|
increasingly unfriendly to users. On the contrary, many Linux
|
||||||
|
distributions have improved the user experience to the maximum, and
|
||||||
|
today we can claim that Linux enables significantly more pleasant work,
|
||||||
|
regardless of the user's technical knowledge.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Windows imposes on users functionalities that users do not want to use, such as: cloud integrations, AI, advertisements, mandatory accounts, and the like. These functionalities serve above all to increase Microsoft's profits, and have no benefit for most end users. Also, basic programs such as calendars, calculators or text editors have become slow and full of bugs. With useless functionalities, Windows becomes more demanding every year and requires the purchase of better hardware, leading to an increase in electronic waste. Unlike Windows, the latest Linux distributions work very well on computers that are more than a decade old.</p>
|
<p>
|
||||||
|
Windows imposes on users functionalities that users do not want to use,
|
||||||
|
such as: cloud integrations, AI, advertisements, mandatory accounts, and
|
||||||
|
the like. These functionalities serve above all to increase Microsoft's
|
||||||
|
profits, and have no benefit for most end users. Also, basic programs
|
||||||
|
such as calendars, calculators or text editors have become slow and full
|
||||||
|
of bugs. With useless functionalities, Windows becomes more demanding
|
||||||
|
every year and requires the purchase of better hardware, leading to an
|
||||||
|
increase in electronic waste. Unlike Windows, the latest Linux
|
||||||
|
distributions work very well on computers that are more than a decade
|
||||||
|
old.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>The choice of an operating system is no longer just a technical decision, but also an environmental attitude.</p>
|
<p>
|
||||||
|
The choice of an operating system is no longer just a technical
|
||||||
|
decision, but also an environmental attitude.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2>Installation methods</h2>
|
<h2>Installation methods</h2>
|
||||||
|
|
||||||
<p>We can install Linux in three ways:</p>
|
<p>We can install Linux in three ways:</p>
|
||||||
|
|
||||||
<ol>
|
<ol>
|
||||||
<li><strong>Inside a virtual machine on Windows.</strong> In this way, the user retains his existing operating system and the data on it. Linux in a virtual machine will be significantly slower than an installation without virtualization.
|
<li>
|
||||||
</li>
|
<strong>Inside a virtual machine on Windows.</strong> In this way, the
|
||||||
<li><strong>In addition to the existing operating system.</strong> If it is possible to shrink one of your partitions and free up at least 10GB of space, you can install a Linux operating system in addition to Windows. When booting the computer, the user will be able to choose whether to boot Windows or Linux. With such an installation, there is a certain risk that one of the subsequent Windows updates will reset the bootloader settings, after which a small intervention is required to make the Linux system accessible again.</li>
|
user retains his existing operating system and the data on it. Linux
|
||||||
<li><strong>By completely removing the Windows system.</strong> In place of the Windows partition, a new partition with the Linux distribution will be placed. Additional partitions that exist may or may not be removed.</li>
|
in a virtual machine will be significantly slower than an installation
|
||||||
</ol>
|
without virtualization.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>In addition to the existing operating system.</strong> If it
|
||||||
|
is possible to shrink one of your partitions and free up at least 10GB
|
||||||
|
of space, you can install a Linux operating system in addition to
|
||||||
|
Windows. When booting the computer, the user will be able to choose
|
||||||
|
whether to boot Windows or Linux. With such an installation, there is
|
||||||
|
a certain risk that one of the subsequent Windows updates will reset
|
||||||
|
the bootloader settings, after which a small intervention is required
|
||||||
|
to make the Linux system accessible again.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>By completely removing the Windows system.</strong> In place
|
||||||
|
of the Windows partition, a new partition with the Linux distribution
|
||||||
|
will be placed. Additional partitions that exist may or may not be
|
||||||
|
removed.
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
<h2>Before arrival</h2>
|
<h2>Before arrival</h2>
|
||||||
|
|
||||||
<p>In order for the installation to be effective, before coming to the Linux Instal Fest, it is necessary to make a backup of the data from the system partition if you decide on the second or third installation option. If you have two partitions (for example, C and D), move the data from the system partition (C:) that you want to keep to the non-system partition (D:). If you don't have an additional partition, you can use a USB flash drive. Pay attention to the files inside the user directory (Desktop, Downloads, Documents,... ), and export bookmarks and passwords from the browser.</p>
|
<p>
|
||||||
|
In order for the installation to be effective, before coming to the
|
||||||
|
Linux Instal Fest, it is necessary to make a backup of the data from the
|
||||||
|
system partition if you decide on the second or third installation
|
||||||
|
option. If you have two partitions (for example, C and D), move the data
|
||||||
|
from the system partition (C:) that you want to keep to the non-system
|
||||||
|
partition (D:). If you don't have an additional partition, you can use a
|
||||||
|
USB flash drive. Pay attention to the files inside the user directory
|
||||||
|
(Desktop, Downloads, Documents,... ), and export bookmarks and passwords
|
||||||
|
from the browser.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>Also, before your arrival, you can familiarize yourself with the appearance and way of functioning of various Linux distributions. You can try some Linux distributions through the browser, without any installation, on the
|
<p>
|
||||||
<a href="https://distrosea.com/">DistroSea</a> website (sometimes it is necessary to wait a short time to free up resources on the site). Please note that the operating system on this site is many times slower than the system installed on your computer.
|
Also, before your arrival, you can familiarize yourself with the
|
||||||
</p>
|
appearance and way of functioning of various Linux distributions. You
|
||||||
|
can try some Linux distributions through the browser, without any
|
||||||
|
installation, on the
|
||||||
|
<a href="https://distrosea.com/">DistroSea</a> website (sometimes it is
|
||||||
|
necessary to wait a short time to free up resources on the site). Please
|
||||||
|
note that the operating system on this site is many times slower than
|
||||||
|
the system installed on your computer.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2>Organizer</h2>
|
<h2>Organizer</h2>
|
||||||
|
|
||||||
<p>The organizer of the event is <a href="https://dmz.rs/en/">Decentrala</a> - a group of enthusiasts gathered around the ideas of decentralization and free dissemination of knowledge. So far, we have organized more than <a
|
<p>
|
||||||
href="https://dmz.rs/en/events_archive">300 events</a>, and we regularly announce the next events on the <a href="https://dmz.rs/en/events">Events</a> page.
|
The organizer of the event is
|
||||||
</p>
|
<a href="https://dmz.rs/en/">Decentrala</a> - a group of enthusiasts
|
||||||
|
gathered around the ideas of decentralization and free dissemination of
|
||||||
|
knowledge. So far, we have organized more than
|
||||||
|
<a href="https://dmz.rs/en/events_archive">300 events</a>, and we
|
||||||
|
regularly announce the next events on the
|
||||||
|
<a href="https://dmz.rs/en/events">Events</a> page.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>In the following period, two more events for Linux beginners will be held at the same location (classroom JAG3):</p>
|
<p>
|
||||||
<ul>
|
In the following period, two more events for Linux beginners will be
|
||||||
<li><strong>Tuesday December 16</strong> - Introduction to the Linux command line</li>
|
held at the same location (classroom JAG3):
|
||||||
<li><strong>Tuesday, December 23</strong> - Introduction to Git</li>
|
</p>
|
||||||
</ul>
|
<ul>
|
||||||
<p>Events start at 6pm.</p>
|
<li>
|
||||||
|
<strong>Tuesday December 16</strong> - Introduction to the Linux
|
||||||
|
command line
|
||||||
|
</li>
|
||||||
|
<li><strong>Tuesday, December 23</strong> - Introduction to Git</li>
|
||||||
|
</ul>
|
||||||
|
<p>Events start at 6pm.</p>
|
||||||
|
|
||||||
<h2>Ponovo</h2>
|
<h2>Ponovo</h2>
|
||||||
<p>You can bring defective devices to the Linux install fest: laptops, phones, desktop computers, monitors... We will deliver them to the organization <a href="https://ponovo.rs/">Ponovo</a> in Kikinda during January. This organization will repair these devices and thereby prevent the increase of electronic waste.</p>
|
<p>
|
||||||
|
You can bring defective devices to the Linux install fest: laptops,
|
||||||
|
phones, desktop computers, monitors... We will deliver them to the
|
||||||
|
organization <a href="https://ponovo.rs/">Ponovo</a> in Kikinda during
|
||||||
|
January. This organization will repair these devices and thereby prevent
|
||||||
|
the increase of electronic waste.
|
||||||
|
</p>
|
||||||
</main>
|
</main>
|
||||||
</body>
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
</html>
|
|
||||||
@@ -1,94 +1,62 @@
|
|||||||
const theme_switcher = document.getElementById("theme-switcher");
|
window.addEventListener("DOMContentLoaded", () => {
|
||||||
const imgs = document.getElementsByTagName("img");
|
|
||||||
const sections_button = document.getElementById("sections-button");
|
|
||||||
const sections_menu = document.getElementsByTagName("nav")[0];
|
|
||||||
const main = document.getElementsByTagName("main")[0];
|
|
||||||
|
|
||||||
let theme = window.localStorage.getItem("theme");
|
const getById = (id) => document.getElementById(id);
|
||||||
|
const getByClass = (className) => document.getElementsByClassName(className)[0];
|
||||||
|
|
||||||
if (theme !== null) {
|
const themeBtn = getById("theme-switcher");
|
||||||
if (theme === "light") {
|
const hamburger = getByClass("hamburger");
|
||||||
changeToLightTheme();
|
const hamburgerIcon = hamburger.children[0]
|
||||||
} else {
|
const menu = document.getElementsByTagName("nav")[0];
|
||||||
changeToDarkTheme();
|
const imgs = document.getElementsByTagName("img");
|
||||||
|
const main = document.getElementsByTagName("main")[0];
|
||||||
|
const isMenuOpen = () => hamburger.classList.contains("open");
|
||||||
|
const theme = window.localStorage.getItem("theme");
|
||||||
|
|
||||||
|
/* Functions */
|
||||||
|
|
||||||
|
const changeToDarkTheme = () => {
|
||||||
|
document.documentElement.classList.add("dark");
|
||||||
|
themeBtn?.setAttribute("title", "turn the light on");
|
||||||
|
Array.from(imgs).forEach((img) => {
|
||||||
|
if (img.src.includes("-light")) img.src = img.src.replace("-light", "-dark");
|
||||||
|
});
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if (
|
const changeToLightTheme = () => {
|
||||||
window.matchMedia &&
|
document.documentElement.classList.remove("dark");
|
||||||
window.matchMedia("(prefers-color-scheme: dark)").matches
|
themeBtn?.setAttribute("title", "turn the light off");
|
||||||
) {
|
Array.from(imgs).forEach((img) => {
|
||||||
changeToDarkTheme();
|
if (img.src.includes("-dark")) img.src = img.src.replace("-dark", "-light");
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
theme_switcher.addEventListener("click", () => {
|
const closeMenu = () => {
|
||||||
const attribute = theme_switcher.getAttribute("title") ?? "off"
|
hamburger.classList = "hamburger closed"
|
||||||
if (attribute.indexOf("off") !== -1) {
|
hamburgerIcon.src = hamburgerIcon.src.replace("opened", "closed");
|
||||||
changeToDarkTheme();
|
menu.classList = "menu closed";
|
||||||
} else {
|
|
||||||
changeToLightTheme();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
function changeToDarkTheme() {
|
const openMenu = () => {
|
||||||
theme_switcher?.setAttribute("title", "turn the light on");
|
hamburger.classList = "hamburger open"
|
||||||
document.documentElement.style.setProperty("--border", "var(--dark-border)");
|
hamburgerIcon.src = hamburgerIcon.src.replace("closed", "opened");
|
||||||
document.documentElement.style.setProperty("--text", "var(--dark-text)");
|
menu.classList = "menu open";
|
||||||
document.documentElement.style.setProperty("--bg", "var(--dark-bg)");
|
|
||||||
window.localStorage.setItem("theme", "dark");
|
|
||||||
for (let i = 0; i < imgs.length; i += 1) {
|
|
||||||
imgs[i].src = imgs[i].src.replace("-light", "-dark");
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
function changeToLightTheme() {
|
/* Listeners */
|
||||||
theme_switcher?.setAttribute("title", "turn the light off");
|
|
||||||
document.documentElement.style.setProperty("--border", "var(--light-border)");
|
|
||||||
document.documentElement.style.setProperty("--text", "var(--light-text)");
|
|
||||||
document.documentElement.style.setProperty("--bg", "var(--light-bg)");
|
|
||||||
window.localStorage.setItem("theme", "light");
|
|
||||||
for (let i = 0; i < imgs.length; i += 1) {
|
|
||||||
imgs[i].src = imgs[i].src.replace("-dark", "-light");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function closeMenu() {
|
window.addEventListener("resize", () => isMenuOpen() && closeMenu());
|
||||||
sections_button.setAttribute("opened", "false");
|
main.addEventListener("click", () => isMenuOpen() && closeMenu());
|
||||||
sections_button.children[0].src = sections_button.children[0].src.replace(
|
hamburger?.addEventListener("click", () => isMenuOpen() ? closeMenu() : openMenu());
|
||||||
"opened",
|
|
||||||
"closed",
|
|
||||||
);
|
|
||||||
sections_menu.style.display = "none";
|
|
||||||
}
|
|
||||||
|
|
||||||
function openMenu() {
|
themeBtn.addEventListener("click", () => {
|
||||||
sections_button.setAttribute("opened", "true");
|
const title = themeBtn.getAttribute("title") ?? "off"
|
||||||
sections_button.children[0].src = sections_button.children[0].src.replace(
|
if (title.indexOf("off") !== -1) changeToDarkTheme();
|
||||||
"closed",
|
else changeToLightTheme();
|
||||||
"opened",
|
});
|
||||||
);
|
|
||||||
sections_menu.style.display = "flex";
|
|
||||||
sections_menu.style.flexDirection = "column";
|
|
||||||
}
|
|
||||||
|
|
||||||
sections_button.addEventListener("click", () => {
|
|
||||||
if (sections_button.getAttribute("opened") === "false") {
|
|
||||||
openMenu();
|
|
||||||
} else {
|
|
||||||
closeMenu();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
window.addEventListener("resize", () => {
|
|
||||||
if (sections_button.getAttribute("opened") === "true") {
|
|
||||||
closeMenu();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
main.addEventListener("click", () => {
|
|
||||||
if (sections_button.getAttribute("opened") === "true") {
|
|
||||||
closeMenu();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
/* Rest */
|
||||||
|
|
||||||
|
const userPerfersDark = window?.matchMedia?.("(prefers-color-scheme: dark)").matches
|
||||||
|
if (!theme && userPerfersDark) changeToDarkTheme();
|
||||||
|
else theme === "light" ? changeToLightTheme() : changeToDarkTheme();
|
||||||
|
})
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
main {
|
main {
|
||||||
max-width: fit-content;
|
max-width: fit-content;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 1rem;
|
gap: 1rem;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
main img {
|
main img {
|
||||||
width: min(70vw, 15rem);
|
width: min(70vw, 15rem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,10 @@ dl {
|
|||||||
|
|
||||||
dt {
|
dt {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
margin: 1rem 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
dd {
|
dd {
|
||||||
margin: 0 0 1rem 1rem;
|
margin: 0 0 0.5rem 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
.auth-wrap {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 2px;
|
||||||
|
padding-top: 24px;
|
||||||
|
a {
|
||||||
|
font-size: 18px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 3px;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
#mesh {
|
#mesh {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,4 +8,5 @@ dt {
|
|||||||
|
|
||||||
dd {
|
dd {
|
||||||
margin: 0 0 1rem 1rem;
|
margin: 0 0 1rem 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,25 +1,30 @@
|
|||||||
|
.description {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 4px;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
.event {
|
.event {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
}
|
|
||||||
|
|
||||||
.event:hover {
|
&:hover {
|
||||||
border-bottom: 5px var(--hightlight) solid;
|
border-bottom: 5px var(--hightlight) solid;
|
||||||
}
|
& > div {
|
||||||
|
padding-bottom: calc(0.5rem - 5px);
|
||||||
.event:hover > div {
|
}
|
||||||
padding-bottom: calc(0.5rem - 5px);
|
}
|
||||||
}
|
& > div {
|
||||||
|
padding-top: 0.5rem;
|
||||||
.event > div {
|
padding-bottom: 0.5rem;
|
||||||
padding-top: 0.5rem;
|
white-space: nowrap;
|
||||||
padding-bottom: 0.5rem;
|
}
|
||||||
white-space: nowrap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.date {
|
.date {
|
||||||
width: 250px;
|
width: 220px;
|
||||||
font-size: 0.9em;
|
font-size: 0.75em;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
@@ -27,38 +32,44 @@
|
|||||||
.title {
|
.title {
|
||||||
border-left: 2px solid var(--border);
|
border-left: 2px solid var(--border);
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
padding-left: 1rem;
|
padding-left: 2rem;
|
||||||
padding-right: 0.5em;
|
padding-right: 0.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.place {
|
.place {
|
||||||
font-size: 0.9em;
|
font-size: 0.7em;
|
||||||
|
opacity: 0.7;
|
||||||
|
&:before {
|
||||||
|
content: "-";
|
||||||
|
margin-right: 12px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.types {
|
.types {
|
||||||
font-size: 0.9em;
|
font-size: 0.8em;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
font-weight: 900;
|
||||||
|
opacity: 0.7;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 1160px) {
|
@media screen and (max-width: 1160px) {
|
||||||
.event {
|
.event {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
margin-bottom: 1rem;
|
margin-bottom: 2.2rem;
|
||||||
border-left: 3px solid var(--border);
|
border-left: 3px solid var(--border);
|
||||||
}
|
&:hover {
|
||||||
|
border-bottom: none;
|
||||||
.event > div {
|
border-left: 3px solid var(--hightlight);
|
||||||
padding: 0 0.5rem;
|
& > div {
|
||||||
white-space: normal;
|
padding-bottom: 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
.event:hover {
|
& > div {
|
||||||
border-bottom: none;
|
padding: 0 0.5rem;
|
||||||
}
|
white-space: normal;
|
||||||
|
}
|
||||||
.event:hover > div {
|
|
||||||
padding-bottom: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.date {
|
.date {
|
||||||
@@ -68,6 +79,9 @@
|
|||||||
.title {
|
.title {
|
||||||
border-left: none;
|
border-left: none;
|
||||||
}
|
}
|
||||||
|
.place:before {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
.types {
|
.types {
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
|
|||||||
@@ -8,4 +8,5 @@ dt {
|
|||||||
|
|
||||||
dd {
|
dd {
|
||||||
margin: 0 0 1rem 1rem;
|
margin: 0 0 1rem 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,76 +1,74 @@
|
|||||||
|
|
||||||
html {
|
html {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: Facade;
|
font-family: Facade;
|
||||||
src: url(../font/Facade-Sud.woff);
|
src: url(../font/Facade-Sud.woff);
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: jetbrains-mono;
|
|
||||||
src: url(../font/JetBrainsMono-Regular.ttf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
html, body {
|
@font-face {
|
||||||
margin: 0;
|
font-family: jetbrains-mono;
|
||||||
padding: 0;
|
src: url(../font/JetBrainsMono-Regular.ttf);
|
||||||
|
}
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
main {
|
main {
|
||||||
max-width: 1200px;
|
max-width: 1200px;
|
||||||
margin: auto;
|
margin: auto;
|
||||||
font-family: 'jetbrains-mono';
|
font-family: "jetbrains-mono";
|
||||||
padding: 2.3rem;
|
padding: 2.3rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
font-family: 'Facade';
|
font-family: "Facade";
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 5rem;
|
font-size: 5rem;
|
||||||
margin: 0rem;
|
margin: 0rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin-top: 0.0rem;
|
margin-top: 0rem;
|
||||||
margin-bottom: 2rem;
|
margin-bottom: 2rem;
|
||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
p {
|
p {
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
table {
|
table {
|
||||||
margin: 4rem 0;
|
margin: 4rem 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
td {
|
td {
|
||||||
font-size: 1.8rem;
|
font-size: 1.8rem;
|
||||||
padding-top: 0.5rem;
|
padding-top: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
td:first-child {
|
td:first-child {
|
||||||
width: 3.5rem;
|
width: 3.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
td:nth-child(2) {
|
td:nth-child(2) {
|
||||||
padding-right: 1rem;
|
padding-right: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#link {
|
#link {
|
||||||
margin-top: 4rem;
|
margin-top: 4rem;
|
||||||
font-size: 3rem;
|
font-size: 3rem;
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
float: right;
|
float: right;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
#link img {
|
#link img {
|
||||||
width: 4rem;
|
width: 4rem;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ blockquote {
|
|||||||
|
|
||||||
blockquote::before,
|
blockquote::before,
|
||||||
blockquote::after {
|
blockquote::after {
|
||||||
content: '';
|
content: "";
|
||||||
content: none;
|
content: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,4 +146,5 @@ h5,
|
|||||||
h6 {
|
h6 {
|
||||||
overflow-wrap: break-word;
|
overflow-wrap: break-word;
|
||||||
hyphens: auto;
|
hyphens: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,21 +6,19 @@ table {
|
|||||||
|
|
||||||
th,
|
th,
|
||||||
td {
|
td {
|
||||||
padding: 0 1rem 0 1rem;
|
|
||||||
text-align: left;
|
text-align: left;
|
||||||
border-left: 2px solid var(--border);
|
border-left: 2px solid var(--border);
|
||||||
}
|
}
|
||||||
|
|
||||||
th {
|
th {
|
||||||
padding: 1rem 1rem 0 1rem;
|
padding: 1rem;
|
||||||
border-bottom: 2px solid var(--border);
|
border-bottom: 2px solid var(--border);
|
||||||
}
|
}
|
||||||
|
|
||||||
td {
|
td {
|
||||||
padding: 0 1rem 1rem 1rem;
|
padding: 1rem 1rem 0 1rem;
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
}
|
a {
|
||||||
|
word-break: keep-all;
|
||||||
td a {
|
}
|
||||||
word-break: keep-all;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,3 +8,15 @@ h2 {
|
|||||||
p {
|
p {
|
||||||
padding-bottom: 1.5rem;
|
padding-bottom: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.values {
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
label {
|
||||||
|
display: block;
|
||||||
|
padding-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul > li {
|
||||||
|
padding-left: 1.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,6 +11,12 @@
|
|||||||
--bg: var(--light-bg);
|
--bg: var(--light-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
html.dark {
|
||||||
|
--border: var(--dark-border);
|
||||||
|
--text: var(--dark-text);
|
||||||
|
--bg: var(--dark-bg);
|
||||||
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Iosevka";
|
font-family: "Iosevka";
|
||||||
src: url("/font/iosevka-regular.woff") format("woff");
|
src: url("/font/iosevka-regular.woff") format("woff");
|
||||||
@@ -153,7 +159,7 @@ a:visited {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#sections-button {
|
.hamburger {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,7 +192,7 @@ button {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 1160px) {
|
@media screen and (max-width: 1160px) {
|
||||||
nav {
|
nav.menu {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
border: 2px solid var(--border);
|
border: 2px solid var(--border);
|
||||||
border-bottom: 0;
|
border-bottom: 0;
|
||||||
@@ -198,9 +204,13 @@ button {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 2rem 3rem;
|
padding: 2rem 3rem;
|
||||||
display: none;
|
display: none;
|
||||||
|
&.open {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#sections-button {
|
.hamburger {
|
||||||
display: block !important;
|
display: block !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,11 +4,8 @@ p {
|
|||||||
|
|
||||||
li {
|
li {
|
||||||
padding-left: 1.5rem;
|
padding-left: 1.5rem;
|
||||||
|
i {
|
||||||
|
word-break: break-all;
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
li i {
|
|
||||||
word-break: break-all;
|
|
||||||
font-size: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
87
template/base.html
Normal file
87
template/base.html
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="{{ lang }}">
|
||||||
|
<head>
|
||||||
|
<!--
|
||||||
|
*@@*
|
||||||
|
*@@@@*
|
||||||
|
*@@*
|
||||||
|
||
|
||||||
|
||
|
||||||
|
*@@* *@@* *@@*
|
||||||
|
*@@@@*===*@@@@*===*@@@@*
|
||||||
|
*@@* *@@* *@@*
|
||||||
|
|| //
|
||||||
|
|| //
|
||||||
|
*@@*//
|
||||||
|
*@@@@*
|
||||||
|
*@@*
|
||||||
|
|
||||||
|
____ _____ ____ _____ _ _ _____ ____ _ _ _
|
||||||
|
| _ \| ____/ ___| ____| \ | |_ _| _ \ / \ | | / \
|
||||||
|
| | | | _|| | | _| | \| | | | | |_) | / _ \ | | / _ \
|
||||||
|
| |_| | |__| |___| |___| |\ | | | | _ < / ___ \| |___ / ___ \
|
||||||
|
|____/|_____\____|_____|_| \_| |_| |_| \_\/_/ \_\_____/_/ \_\
|
||||||
|
-->
|
||||||
|
|
||||||
|
<script>
|
||||||
|
(function () {
|
||||||
|
const theme = localStorage.getItem("theme");
|
||||||
|
const prefersDark = window.matchMedia(
|
||||||
|
"(prefers-color-scheme: dark)",
|
||||||
|
).matches;
|
||||||
|
if (theme === "dark" || (!theme && prefersDark))
|
||||||
|
document.documentElement.classList.add("dark");
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="/styles/reset.css" />
|
||||||
|
<link rel="stylesheet" href="/styles/style.css" />
|
||||||
|
{% block extra_styles %}{% endblock %}
|
||||||
|
<link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon" />
|
||||||
|
<script src="/scripts/main.js"></script>
|
||||||
|
<title>{{ title }} Decentrala</title>
|
||||||
|
<link rel="alternate" hreflang="sr" href="{{ sr_link }}" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<a id="logo" href="/">
|
||||||
|
<img src="/img/logo-{{ 'dark' if is_dark else 'light' }}.svg" alt="Logo" /> Decentrala
|
||||||
|
</a>
|
||||||
|
<button id="theme-switcher"></button>
|
||||||
|
<a class="lang" hreflang="{{ 'sr' if lang == 'en' else 'en' }}" href="{{ current_path.replace('/en/', '/') if lang == 'en' else ('/en' + current_path if not current_path.startswith('/en/') else current_path) }}">{{ 'SR' if lang == 'en' else 'EN' }}</a>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
{% block content %}{% endblock %}
|
||||||
|
</main>
|
||||||
|
<footer>
|
||||||
|
<button class="hamburger closed">
|
||||||
|
<img src="/img/strelica-closed-{{ 'dark' if is_dark else 'light' }}.svg" alt="Menu" />
|
||||||
|
</button>
|
||||||
|
<nav class="menu">
|
||||||
|
{% set base_path = '/en/' if lang == 'en' else '/' %}
|
||||||
|
<a href="{{ base_path }}events">{{ 'Događaji' if lang == 'sr' else 'Events' }}</a>
|
||||||
|
<a href="{{ base_path }}services">{{ 'Servisi' if lang == 'sr' else 'Services' }}</a>
|
||||||
|
<a href="{{ base_path }}statute">{{ 'Statut' if lang == 'sr' else 'Statute' }}</a>
|
||||||
|
<a href="{{ base_path }}about">{{ 'O nama' if lang == 'sr' else 'About us' }}</a>
|
||||||
|
<a href="{{ base_path }}account">{{ 'Nalog' if lang == 'sr' else 'Account' }}</a>
|
||||||
|
<a href="{{ base_path }}support">{{ 'Podrška' if lang == 'sr' else 'Support' }}</a>
|
||||||
|
</nav>
|
||||||
|
<span class="links">
|
||||||
|
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
|
||||||
|
<img src="/img/cc-{{ 'dark' if is_dark else 'light' }}.svg" alt="CreativeCommons" />
|
||||||
|
</a>
|
||||||
|
<a href="{{ base_path }}webring">
|
||||||
|
<img src="/img/w-{{ 'dark' if is_dark else 'light' }}.svg" alt="Webring" />
|
||||||
|
</a>
|
||||||
|
<a href="https://gitea.dmz.rs/Decentrala/website">
|
||||||
|
<img src="/img/git-{{ 'dark' if is_dark else 'light' }}.svg" alt="SourceCode" />
|
||||||
|
</a>
|
||||||
|
<a href="https://balkan.fedive.rs/@decentrala">
|
||||||
|
<img src="/img/mastodon-{{ 'dark' if is_dark else 'light' }}.svg" alt="Mastodon" />
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1,8 +1,22 @@
|
|||||||
|
{% block content %}
|
||||||
<h1>Events</h1>
|
<h1>Events</h1>
|
||||||
<p>
|
|
||||||
Following list contains all forthcoming events. Held events are listed in
|
<div class="description">
|
||||||
<a href="/en/events_archive">archive</a>.
|
<p>
|
||||||
</p>
|
Following list contains all forthcoming events. Held events are listed in
|
||||||
<br />
|
<a href="/{{ lang }}/events_archive">archive</a>.
|
||||||
<p>We also provide <a href="https://dmz.rs/events.ical">ical file</a></p>
|
</p>
|
||||||
<br />
|
<p>
|
||||||
|
Events are also available as an
|
||||||
|
<a href="https://dmz.rs/events.ical">ical</a> file.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="https://wiki.dmz.rs/en/kako-pronaci-prostor" target="_blank">Short description</a>
|
||||||
|
how to find a space
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="events-list">
|
||||||
|
{{ events_html|safe }}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|||||||
@@ -1,16 +1,22 @@
|
|||||||
|
{% block content %}
|
||||||
<h1>Događaji</h1>
|
<h1>Događaji</h1>
|
||||||
<p>
|
|
||||||
Naredna lista sadrži sve predstojeće događaje. Za listu održanih događaja
|
<div class="description">
|
||||||
pogledaj <a href="/events_archive">arhivu</a>.
|
<p>
|
||||||
</p>
|
Naredna lista sadrži sve predstojeće događaje. Za listu održanih događaja
|
||||||
<br />
|
pogledaj <a href="/{{ lang }}/events_archive">arhivu</a>.
|
||||||
<p>
|
</p>
|
||||||
Događaje možeš učitati i sa
|
<p>
|
||||||
<a href="https://dmz.rs/events.ical">ical</a> datotekom.
|
Događaje možeš učitati i sa
|
||||||
</p>
|
<a href="https://dmz.rs/events.ical">ical</a> datotekom.
|
||||||
<br />
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a href="https://wiki.dmz.rs/en/kako-pronaci-prostor" target="_blank">Kratako uputstvo</a> kako pronaci prostor
|
<a href="https://wiki.dmz.rs/en/kako-pronaci-prostor" target="_blank">Kratako uputstvo</a>
|
||||||
</p>
|
kako pronaci prostor
|
||||||
<br />
|
</p>
|
||||||
<br />
|
</div>
|
||||||
|
|
||||||
|
<div class="events-list">
|
||||||
|
{{ events_html|safe }}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|||||||
@@ -1,2 +1,14 @@
|
|||||||
<h1>Events archive</h1>
|
{% block title %}Events archive{% endblock %}
|
||||||
<p>All events that we organized so far. You can find future events on <a href="/en/events">Events page</a></p><br>
|
|
||||||
|
{% block content %}
|
||||||
|
<h1 class="title">Events archive</h1>
|
||||||
|
<p>
|
||||||
|
All events that we organized so far. You can find future events on
|
||||||
|
<a href="/{{ lang }}/events">Events page</a>
|
||||||
|
</p>
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<div class="events-list">
|
||||||
|
{{ events_html|safe }}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|||||||
@@ -1,2 +1,14 @@
|
|||||||
<h1>Arhiva događaja</h1>
|
{% block title %}Arhiva događaja{% endblock %}
|
||||||
<p>Svi događaji koje smo do sada organzivali. Predstojeće događaje možeš naći <a href="/events">ovde</a></p><br>
|
|
||||||
|
{% block content %}
|
||||||
|
<h1 class="title">Arhiva događaja</h1>
|
||||||
|
<p>
|
||||||
|
Svi događaji koje smo do sada organzivali. Predstojeće događaje možeš naći
|
||||||
|
<a href="/{{ lang }}/events">ovde</a>
|
||||||
|
</p>
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<div class="events-list">
|
||||||
|
{{ events_html|safe }}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|||||||
@@ -1,78 +1,11 @@
|
|||||||
<!doctype html>
|
{% extends "base.html" %}
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
|
|
||||||
<!-- <pre>
|
{% block title %}{{ title }} Decentrala{% endblock %}
|
||||||
|
|
||||||
*@@*
|
{% block extra_styles %}{{ extra_styles|safe }}{% endblock %}
|
||||||
*@@@@*
|
|
||||||
*@@*
|
|
||||||
||
|
|
||||||
||
|
|
||||||
*@@* *@@* *@@*
|
|
||||||
*@@@@*===*@@@@*===*@@@@*
|
|
||||||
*@@* *@@* *@@*
|
|
||||||
|| //
|
|
||||||
|| //
|
|
||||||
*@@*//
|
|
||||||
*@@@@*
|
|
||||||
*@@*
|
|
||||||
|
|
||||||
____ _____ ____ _____ _ _ _____ ____ _ _ _
|
{% block content %}
|
||||||
| _ \| ____/ ___| ____| \ | |_ _| _ \ / \ | | / \
|
<div class="page-wrap">
|
||||||
| | | | _|| | | _| | \| | | | | |_) | / _ \ | | / _ \
|
{{ content|safe }}
|
||||||
| |_| | |__| |___| |___| |\ | | | | _ < / ___ \| |___ / ___ \
|
</div>
|
||||||
|____/|_____\____|_____|_| \_| |_| |_| \_\/_/ \_\_____/_/ \_\
|
{% endblock %}
|
||||||
|
|
||||||
</pre> -->
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="/styles/reset.css" />
|
|
||||||
<link rel="stylesheet" href="/styles/style.css" />
|
|
||||||
<!--ADDITIONAL_STYLE-->
|
|
||||||
<link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon" />
|
|
||||||
<script src="/scripts/main.js" defer></script>
|
|
||||||
<title><!--TITLE--> Decentrala</title>
|
|
||||||
<link rel="alternate" hreflang="sr" href="/PAGE_NAME" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<header>
|
|
||||||
<a id="logo" href="/en/index">
|
|
||||||
<img src="/img/logo-light.svg" alt="Logo" /> Decentrala
|
|
||||||
</a>
|
|
||||||
<button id="theme-switcher"></button>
|
|
||||||
<a class="lang" hreflang="sr" href="/PAGE_NAME">SR</a>
|
|
||||||
</header>
|
|
||||||
<main>
|
|
||||||
<div class="page-wrap">
|
|
||||||
<!--MAIN-->
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
<footer>
|
|
||||||
<button id="sections-button" opened="false">
|
|
||||||
<img src="/img/strelica-closed-light.svg" alt="OpenMenu" />
|
|
||||||
</button>
|
|
||||||
<nav>
|
|
||||||
<a href="/en/events">Events</a>
|
|
||||||
<a href="/en/services">Services</a>
|
|
||||||
<a href="/en/statute">Statute</a>
|
|
||||||
<a href="/en/about">About</a>
|
|
||||||
<a href="/en/account">Account</a>
|
|
||||||
<a href="/en/support">Support</a>
|
|
||||||
</nav>
|
|
||||||
<span class="links">
|
|
||||||
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/"
|
|
||||||
><img src="/img/cc-light.svg" alt="CreativeCommons"
|
|
||||||
/></a>
|
|
||||||
<a href="/en/webring"><img src="/img/w-light.svg" alt="Webring" /></a>
|
|
||||||
<a href="https://gitea.dmz.rs/Decentrala/website"
|
|
||||||
><img src="/img/git-light.svg" alt="SourceCode"
|
|
||||||
/></a>
|
|
||||||
<a href="https://balkan.fedive.rs/@decentrala"
|
|
||||||
><img src="/img/mastodon-light.svg" alt="Mastodon"
|
|
||||||
/></a>
|
|
||||||
</span>
|
|
||||||
</footer>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|||||||
@@ -1,70 +1,11 @@
|
|||||||
<!DOCTYPE html>
|
{% extends "base.html" %}
|
||||||
<html lang="sr">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
|
|
||||||
<!--
|
{% block title %}{{ title }} Decentrala{% endblock %}
|
||||||
<pre>
|
|
||||||
|
|
||||||
*@@*
|
{% block extra_styles %}{{ extra_styles|safe }}{% endblock %}
|
||||||
*@@@@*
|
|
||||||
*@@*
|
|
||||||
||
|
|
||||||
||
|
|
||||||
*@@* *@@* *@@*
|
|
||||||
*@@@@*===*@@@@*===*@@@@*
|
|
||||||
*@@* *@@* *@@*
|
|
||||||
|| //
|
|
||||||
|| //
|
|
||||||
*@@*//
|
|
||||||
*@@@@*
|
|
||||||
*@@*
|
|
||||||
|
|
||||||
____ _____ ____ _____ _ _ _____ ____ _ _ _
|
{% block content %}
|
||||||
| _ \| ____/ ___| ____| \ | |_ _| _ \ / \ | | / \
|
<div class="page-wrap">
|
||||||
| | | | _|| | | _| | \| | | | | |_) | / _ \ | | / _ \
|
{{ content|safe }}
|
||||||
| |_| | |__| |___| |___| |\ | | | | _ < / ___ \| |___ / ___ \
|
</div>
|
||||||
|____/|_____\____|_____|_| \_| |_| |_| \_\/_/ \_\_____/_/ \_\
|
{% endblock %}
|
||||||
|
|
||||||
</pre>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="/styles/reset.css">
|
|
||||||
<link rel="stylesheet" href="/styles/style.css">
|
|
||||||
<!--ADDITIONAL_STYLE-->
|
|
||||||
<link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon">
|
|
||||||
<script src="/scripts/main.js" defer></script>
|
|
||||||
<title><!--TITLE--> Decentrala</title>
|
|
||||||
<link rel="alternate" hreflang="en" href="/en/PAGE_NAME" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<header>
|
|
||||||
<a id="logo" href="/"><img src="/img/logo-light.svg" alt="Logo"> Decentrala</a>
|
|
||||||
<button id="theme-switcher"></button>
|
|
||||||
<a class="lang" hreflang="en" href="/en/PAGE_NAME">EN</a>
|
|
||||||
</header>
|
|
||||||
<main>
|
|
||||||
<div class="page-wrap">
|
|
||||||
<!--MAIN-->
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
<footer>
|
|
||||||
<button id="sections-button" opened="false"><img src="/img/strelica-closed-light.svg" alt="OpenMenu"></button>
|
|
||||||
<nav>
|
|
||||||
<a href="/events">Događaji</a>
|
|
||||||
<a href="/services">Servisi</a>
|
|
||||||
<a href="/statute">Statut</a>
|
|
||||||
<a href="/about">O nama</>
|
|
||||||
<a class="account" href="/account">Nalog</a>
|
|
||||||
<a href="/support">Podrška</a>
|
|
||||||
</nav>
|
|
||||||
<span class="links">
|
|
||||||
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/"><img src="/img/cc-light.svg" alt="CreativeCommons"></a>
|
|
||||||
<a href="/webring"><img src="/img/w-light.svg" alt="Webring"></a>
|
|
||||||
<a href="https://gitea.dmz.rs/Decentrala/website"><img src="/img/git-light.svg" alt="SourceCode"></a>
|
|
||||||
<a href="https://balkan.fedive.rs/@decentrala"><img src="/img/mastodon-light.svg" alt="Mastodon"></a>
|
|
||||||
</span>
|
|
||||||
</footer>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|||||||
Reference in New Issue
Block a user