Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ jobs:

- name: Install dependencies
# pillow: bin/check-content reads every person photo to warn about
# one with no colour. Without it the check runs and says it skipped
# one with no color. Without it the check runs and says it skipped
# that.
run: pip install pyyaml pillow

Expand Down
8 changes: 4 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ says how to install it when it is absent.
**`unsafe=true` in `[markup.goldmark.renderer]`.** Raw HTML in front matter
and page bodies renders unescaped. Two content files still carry it,
`content/events/pyday_bcn/pyday_bcn_2018.md` and `pyday_bcn_2019.md`, which
are pre-Hugo programmes pasted in as tables. So **assume any content field
are pre-Hugo programs pasted in as tables. So **assume any content field
can inject HTML**, and never add a field that reaches a template through
`safeHTML`. `bin/check-html-safety` rejects dangerous markup in content and
`bin/check-rendered` checks the built pages; both run on every pull request.
Expand All @@ -146,12 +146,12 @@ problem somebody else has to find.
the talk and meetup records. Writing them into a person's front matter guarantees
they will eventually contradict the data.

**A programme is two lists, not one.** An event page carries `agenda` (the grid:
**A program is two lists, not one.** An event page carries `agenda` (the grid:
`start`, `track_length`, `room`, and either a `talk` id or its own `label` and
`type`), `talks` (the content: `title`, `speaker`, `description`, `language`,
`topic`, `duration_minutes`, `links`), and `rooms` (`id` and `name`). They are
separate because one talk can take several slots, and because a photo of the
gallery links to a talk by id, which a row of a grid cannot give it. The colour
gallery links to a talk by id, which a row of a grid cannot give it. The color
of a block and the end of a slot are computed, not stored: see
`partials/agenda_entry.html`. **A time is always a quoted string.** YAML 1.1
reads an unquoted `9:00` as the integer 540, sexagesimal, so Hugo renders it
Expand Down Expand Up @@ -184,7 +184,7 @@ attribute, not a title. Hosting one meetup is not being an organizer.

**RSVPs are not attendance.** `rsvps.attendedCount` is zero on 282 of the 285
events of the export, so the only figure available is who said yes on Meetup.
Render it as registrations. The figure was 205 of 207 while only the
Render it as RSVPs. The figure was 205 of 207 while only the
`python-barcelona` group was read; the import reads `pyladies-bcn` as well.

**No personal data beyond what is already published.** Never render email
Expand Down
8 changes: 4 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ same text the site publishes at
[pybcn.org/pybcn_association/coc/](https://pybcn.org/pybcn_association/coc/),
which renders that file.

## Licence
## License

The code of the site is under the [MIT License](LICENSE) and the content is
under [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/).
Expand All @@ -41,7 +41,7 @@ is edited there, and a change made on `master` is lost on the next deploy.

**You do not need Git, GitHub, or any of the rest of this file.**

If you have spoken at one of our events, or you organise with us, you may have
If you have spoken at one of our events, or you organize with us, you may have
a card on the [organizers page](https://pybcn.org/pybcn_association/organizers/)
or on the page of the event. Clicking it opens what the site holds about you.
To change any of it, or to have it removed, **send an email to
Expand Down Expand Up @@ -105,7 +105,7 @@ Edit the file on GitHub, or clone the repository and follow the steps below.
to see which ones have no page yet, then
`bin/new-meetup <the Meetup URL of the event>`. It writes the page from the
public event page: the title, the day, the venue, the number of
registrations, the source URL, and the group. It writes no talk, because the
RSVPs, the source URL, and the group. It writes no talk, because the
announcement says them in prose: pass `--description` to print that prose,
and see [Import a meetup](README.md#import-a-meetup) for the rest of the
path, which is the same one the 268 pages of the archive came through.
Expand Down Expand Up @@ -160,7 +160,7 @@ What each check is for:
| Check | Fails when |
|---|---|
| Build the site | Hugo cannot build, or emits a warning |
| `bin/check-content` | Front matter does not parse, a person `id` does not match its filename, an id is duplicated, a declared photo is missing, an event references a person or sponsor that does not exist, a social URL has the wrong shape, a field is empty, or an `end_date` is not later than `date`. It warns, without failing, about a photo that is too small or has no colour |
| `bin/check-content` | Front matter does not parse, a person `id` does not match its filename, an id is duplicated, a declared photo is missing, an event references a person or sponsor that does not exist, a social URL has the wrong shape, a field is empty, or an `end_date` is not later than `date`. It warns, without failing, about a photo that is too small or has no color |
| `bin/check-html-safety` | Content carries raw HTML that turns a content change into script execution, a redirect, a credential prompt, or a page overlay. See [Content safety check](README.md#content-safety-check) |
| `bin/check-rendered` | The built pages carry that same markup, which catches a template that produces it even when no content file does, or they link to anything over `http`. See [Rendered page check](README.md#rendered-page-check) |
| `bin/canon.py --selftest` | The one normalization of imported text stops being idempotent, or changes what it strips |
Expand Down
38 changes: 19 additions & 19 deletions LICENSING.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

This repository holds the source of [pybcn.org](https://pybcn.org/), the site
of the Associació Python Barcelona (PyBCN). It holds three kinds of thing, and
one licence does not fit all of them: the code of the site, the text of the
one license does not fit all of them: the code of the site, the text of the
site, and material that the association publishes but does not own. This file
says which licence covers which path, and which paths no licence covers at all.
says which license covers which path, and which paths no license covers at all.

GitHub reads the licence of a repository from the `LICENSE` file alone, and a
second licence in that file stops the detection. So `LICENSE` holds the MIT
GitHub reads the license of a repository from the `LICENSE` file alone, and a
second license in that file stops the detection. So `LICENSE` holds the MIT
License text and nothing else, and everything else about licensing is here.

## Code: MIT License
Expand Down Expand Up @@ -35,7 +35,7 @@ of it.
## Content: CC BY-SA 4.0

The text of the site is licensed under the Creative Commons
Attribution-ShareAlike 4.0 International licence (CC BY-SA 4.0):
Attribution-ShareAlike 4.0 International license (CC BY-SA 4.0):

- `content/`, except `content/people/`, see [Person pages](#person-pages).
- `README.md` and `CONTRIBUTING.md`.
Expand All @@ -48,12 +48,12 @@ Deed: <https://creativecommons.org/licenses/by-sa/4.0/>
Legal code: <https://creativecommons.org/licenses/by-sa/4.0/legalcode>

Attribute the text to "Python Barcelona (PyBCN), https://pybcn.org/". The
licence requires attribution, a link to the licence, a note of any change, and
the same licence on any adaptation.
license requires attribution, a link to the license, a note of any change, and
the same license on any adaptation.

The full legal code is not copied here. Creative Commons keeps the canonical
text at the URL above and says a link to it is enough, and a copy in this
repository would be a second licence text at the root, which is what confuses
repository would be a second license text at the root, which is what confuses
the detection described above.

### Code of conduct
Expand All @@ -63,16 +63,16 @@ the detection described above.
licensed under
[CC BY-SA 3.0 Unported](https://creativecommons.org/licenses/by-sa/3.0/). The
adaptation is licensed under CC BY-SA 4.0, like the rest of the content, so
the whole repository is on one version of the licence family.
the whole repository is on one version of the license family.

The licence of the original permits that. Section 4(b) of the
The license of the original permits that. Section 4(b) of the
[CC BY-SA 3.0 legal code](https://creativecommons.org/licenses/by-sa/3.0/legalcode)
says that an Adaptation may be distributed under "(ii) a later version of
this License with the same License Elements as this License", and section 1
names those elements: "Attribution, ShareAlike". CC BY-SA 4.0 is a later
version of that licence, and its License Elements are Attribution and
version of that license, and its License Elements are Attribution and
ShareAlike. The same section 4(b) requires the notices that refer to the
licence of the original to stay intact, so the file keeps its attribution to
license of the original to stay intact, so the file keeps its attribution to
PyLadies and the mention of CC BY-SA 3.0, and adds the link to CC BY-SA 4.0.

ShareAlike is also why the file cannot go under the MIT License: an
Expand All @@ -82,8 +82,8 @@ one.
## Not licensed

The paths below are published on the site but are not covered by either
licence, because the rights in them are not the association's to give. A
licence that promised more than that would tell people they may do things they
license, because the rights in them are not the association's to give. A
license that promised more than that would tell people they may do things they
may not.

### Photographs of people
Expand All @@ -95,7 +95,7 @@ taken at PyBCN events.
The people on this site sent their own photograph for publication on it.
Anyone who did not want one did not send one, and the site shows a silhouette
instead. The association publishes those photographs with the permission of
the people in them, given for that purpose. That permission is not a licence
the people in them, given for that purpose. That permission is not a license
for anyone else to reuse a photograph, for two reasons:

- The copyright in a photograph belongs to whoever took it. Giving PyBCN a
Expand All @@ -105,7 +105,7 @@ for anyone else to reuse a photograph, for two reasons:
would let a stranger reuse and adapt the image, commercially, for ever.
Under Spanish law (Ley Orgánica 1/1982) the right to one's own image is a
personality right and the consent is revocable, so it cannot become a
perpetual and irrevocable licence, which is what CC BY-SA is.
perpetual and irrevocable license, which is what CC BY-SA is.

So the photographs are not licensed. They are published with the permission
of the people in them, and that permission can be withdrawn. The event
Expand Down Expand Up @@ -141,7 +141,7 @@ association publishes the text, it does not own it, and it cannot license it.
There is a second reason, specific to these pages. A person can ask the
association to erase their page, and the GDPR (Article 17.2) then obliges the
association to take reasonable steps to tell anyone else holding a copy that
erasure was requested. A licence that invites lawful copies of a person's
erasure was requested. A license that invites lawful copies of a person's
entry multiplies the copies the association would have to chase, and works
against the erasure it has to be able to deliver.

Expand All @@ -158,14 +158,14 @@ case (section 2(b)(2) of the legal code).
The PyBCN logo and its variants (`themes/pybcn_theme/assets/images/logo.png`,
`themes/pybcn_theme/assets/images/favicon.png`, `static/favicon.ico`,
and the files under `static/images/backgrounds/`)
identify the association. They are not covered by the content licence: use
identify the association. They are not covered by the content license: use
them to refer to PyBCN, not to suggest that PyBCN endorses something it has
not seen. The PyLadies name and logo in that same folder are not the
association's.

### Third-party libraries

Each of these keeps its own licence, and the notice inside each file stays
Each of these keeps its own license, and the notice inside each file stays
with it:

- `themes/pybcn_theme/assets/vendor/`: jQuery 3.3.1 (MIT), jQuery Easing
Expand Down
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ The pages of the archive were written from the Meetup export of both groups,
the X exports of the association, the playlists of our channel, the records
pyvideo keeps of PyData Barcelona 2017, and the frozen copies of the old site
under `static/archives/`. Those sources, the tools that read them, and the
reports of the import live in a separate repository of this organisation,
reports of the import live in a separate repository of this organization,
`pybcn/pybcn-archive`, which is **private**: a copy of a public page is not a
secret, but 950 Meetup comments with the name of whoever wrote them, and the
email addresses, the phone numbers, and the personal profiles that the event
Expand Down Expand Up @@ -229,7 +229,7 @@ About the creation of new sponsors, the `themes/pybcn_theme/archetypes/sponsors.

Every person photo is a square, cut once in the repository rather than on each
build. `bin/square-photos` does the cutting: it finds the face with OpenCV,
crops the largest square it can centre on that face, and resizes to at most
crops the largest square it can center on that face, and resizes to at most
800px, which is what the 2x variant of a 400px grid slot needs. It never
enlarges, because a 200px photo blown up to 800 is the same picture in four
times the bytes.
Expand Down Expand Up @@ -298,7 +298,7 @@ function in `bin/import-meetups`: `title`, `date`, `year`, `venue`,
`attendance`, `meetup_url`, and `group`. `attendance` is who said yes on
Meetup, not who came.

It refuses an event that is not `PAST`, because the registrations are not
It refuses an event that is not `PAST`, because the RSVPs are not
final and the archive records what happened, and an event whose title says
PyDay or PyData, because the large editions have their own pages. `--force`
overrides both. It refuses to overwrite a page that is already there.
Expand Down Expand Up @@ -388,8 +388,8 @@ Each event in the list can indicate:
#### Experience levels

`python_level` and `topic_level` take a token, never markup. The site renders
each token as a badge with a coloured dot and the matching text label, so the
level does not depend on colour alone:
each token as a badge with a colored dot and the matching text label, so the
level does not depend on color alone:

| Token | Label | Dot |
|---|---|---|
Expand Down Expand Up @@ -557,7 +557,7 @@ The people behind the events, the speakers, the organizers, the venues, and
the sponsors, are named on the pages of the site, which stay current on
their own. `static/humans.txt` points at both.

## Licence
## License

The code of the site (the templates, the stylesheets, the scripts, the
workflows, and the configuration) is under the [MIT License](LICENSE). The
Expand All @@ -568,5 +568,5 @@ photographs of people, the person pages, the sponsor logos, the association's
own logos, the third-party libraries, and the archived sites are not licensed,
each for a reason of its own. [LICENSING.md](LICENSING.md) lists every path
and says why. The [code of conduct](CODE_OF_CONDUCT.md) was adapted from the
PyLadies one, which is under CC BY-SA 3.0; that licence allows the adaptation
PyLadies one, which is under CC BY-SA 3.0; that license allows the adaptation
to move to 4.0, and LICENSING.md says how.
Loading
Loading