180 lines
4.4 KiB
Org Mode
180 lines
4.4 KiB
Org Mode
* Mobilizon importer
|
|
|
|
File importer into mobilizon graphql api.
|
|
|
|
** Morganize
|
|
|
|
This doesn't really make a lot of sense. I'm working on a script to import
|
|
events via mobilizon GraphQL api from yaml or json or whatever. Probably yaml.
|
|
|
|
** Functionality
|
|
|
|
*** Login
|
|
|
|
*** Get events
|
|
|
|
*** Create event
|
|
|
|
- options:
|
|
- update existing
|
|
- skip existing
|
|
|
|
**** From file
|
|
|
|
**** User input
|
|
|
|
**** Rss feed
|
|
|
|
**** Verificiraj ali dogodek ze obstaja
|
|
- za rss feed lahko uporabimo link
|
|
|
|
** Structure
|
|
|
|
- python Click library for cli
|
|
- json
|
|
- graphql-core https://github.com/graphql-python/graphql-core
|
|
- https://graphql-core-3.readthedocs.io/en/latest/usage/queries.html
|
|
|
|
*** developing in guix
|
|
|
|
|
|
** Python requests
|
|
|
|
#+BEGIN_EXAMPLE python
|
|
import requests
|
|
import json
|
|
endpoint='https://dogodki.kompot.si/api'
|
|
body='''
|
|
query {
|
|
events {
|
|
elements {
|
|
id,
|
|
url,
|
|
title,
|
|
description,
|
|
beginsOn,
|
|
endsOn,
|
|
status,
|
|
picture {
|
|
url
|
|
},
|
|
physicalAddress {
|
|
id,
|
|
description,
|
|
locality
|
|
}
|
|
}
|
|
total
|
|
}
|
|
}
|
|
'''
|
|
r = requests.post(endpoint, json={'query':body}, '')
|
|
r = requests.post(endpoint, json={"query":body}, headers='')
|
|
r.status_code
|
|
print(json.dumps(r.json(), indent=2))
|
|
body
|
|
body2='''
|
|
query {
|
|
events {
|
|
elements {
|
|
id,
|
|
url,
|
|
title,
|
|
description,
|
|
beginsOn,
|
|
endsOn,
|
|
status,
|
|
picture {
|
|
url
|
|
},
|
|
physicalAddress {
|
|
id,
|
|
description,
|
|
locality
|
|
}
|
|
}
|
|
}
|
|
}
|
|
'''
|
|
body2='''
|
|
query {
|
|
groups {
|
|
elements {
|
|
id,
|
|
name,
|
|
domain,
|
|
page
|
|
}
|
|
}
|
|
}
|
|
'''
|
|
r2 = requests.post(endpoint, json={"query":body2}, headers='')
|
|
print(json.dumps(r2.json(), indent=2))
|
|
body2="query{grups{elements{id,name}}}"
|
|
r2 = requests.post(endpoint, json={"query":body2}, headers='')
|
|
r2.status_code
|
|
print(json.dumps(r2.json(), indent=2))
|
|
b2
|
|
body2
|
|
body2="query{\ngrups{\nelements{\nid,\nname\n}\n}\n}"
|
|
r2 = requests.post(endpoint, json={"query":body2}, headers='')
|
|
r2.status_code
|
|
r2 = requests.post(endpoint, json={"query":body2}, headers='')
|
|
print(json.dumps(r2.json(), indent=2))
|
|
bl='''
|
|
mutation Login($email: String!, $password: String!) {
|
|
login(email: $email, password: $password) {
|
|
accessToken
|
|
refreshToken
|
|
user {
|
|
id
|
|
email
|
|
role
|
|
}
|
|
}
|
|
}
|
|
'''
|
|
varsl= {'email': 'lio@kompot.si', 'password': '<geslo>'}
|
|
r3=requests.post(endpoint, json={"query": bl, 'variables': varsl}, headers='')
|
|
r3.status_code
|
|
print(json.dumps(r3json(), indent=2))
|
|
print(json.dumps(r3.json(), indent=2))
|
|
r3.json()
|
|
r3.json().data
|
|
r3.json().get('data')
|
|
r3.json().get('data').get.('login')
|
|
r3.json().get('data').get('login')
|
|
r3.json().get('data').get('login').get('login')
|
|
r3.json().get('data').get('login').get('accessToken')
|
|
r3.json().get('data.login')
|
|
j=r3.json()
|
|
data=json.loads(j)
|
|
j
|
|
data=json.loads(j)
|
|
print j['data']['login']['accessToken']
|
|
j
|
|
j['data']
|
|
j['data']['login']
|
|
j['data']['login']['accessToken']
|
|
at=j['data']['login']['accessToken']
|
|
head={"Authorization": f"Bearer {at}"}
|
|
r2 = requests.post(endpoint, json={"query":body2}, headers='')
|
|
print(json.dumps(r2.json(), indent=2))
|
|
bg="query{groups{elements{id,name}\ntotal}}"
|
|
r2 = requests.post(endpoint, json={"query":body2}, headers='')
|
|
print(json.dumps(r2.json(), indent=2))
|
|
bg="query {\ngroups {\nelements {\nid,\nname}\ntotal\n}\n}"
|
|
bg
|
|
r2 = requests.post(endpoint, json={"query":bg}, headers=head)
|
|
r2.status_code
|
|
print(json.dumps(r2.json(), indent=2))
|
|
|
|
#+END_EXAMPLE
|
|
|
|
|
|
** RSS import
|
|
This tool can be used to import events from a RSS feed.
|
|
Once run, it checks if there are new events to be added and updates existing ones if need be.
|
|
*** Identification
|
|
Each event is uniquely identified by its' url ("link" field), which is mapped into the "link" field on mobilizon.
|