Skip to content
Snippets Groups Projects
Commit 50a73950 authored by Antoine R. Dumont's avatar Antoine R. Dumont
Browse files

New upstream version 0.0.3

parents efdc153d 1fca3311
No related branches found
Tags debian/upstream/0.0.3
No related merge requests found
Showing
with 762 additions and 791 deletions
FLAKEFLAGS='--exclude=swh/manage.py,swh/deposit/settings.py,swh/deposit/migrations/'
MANAGE=python3 -m swh.manage
db-drop:
dropdb swh-deposit-dev
db-create:
createdb swh-deposit-dev
db-prepare:
$(MANAGE) makemigrations
db-migrate:
$(MANAGE) migrate
db-load-data:
$(MANAGE) loaddata deposit_data
run-dev:
python3 -m swh.deposit.server ./resources/deposit/server.yml
$(MANAGE) runserver
run:
python3 -m swh.deposit.server ~/.config/swh/deposit/server.yml
gunicorn3 swh.deposit.wsgi
Metadata-Version: 1.0
Name: swh.deposit
Version: 0.0.2
Version: 0.0.3
Summary: Software Heritage Deposit Server
Home-page: https://forge.softwareheritage.org/source/swh-deposit/
Author: Software Heritage developers
......
This diff is collapsed.
......@@ -6,9 +6,8 @@ Build-Depends: debhelper (>= 9),
dh-python,
python3-setuptools,
python3-all,
python3-aiohttp,
python3-swh.core (>= 0.0.14~),
python3-jinja2,
python3-django,
python3-click,
python3-vcversioner
Standards-Version: 3.9.6
......
This diff is collapsed.
port: 5012
host: localhost
# 200 Mib max size
max_upload_size: 209715200
verbose: False
debug: False
......@@ -13,15 +13,17 @@ def parse_requirements():
return requirements
# Edit this part to match your module
# full sample: https://forge.softwareheritage.org/diffusion/DCORE/browse/master/setup.py
setup(
name='swh.deposit',
description='Software Heritage Deposit Server',
author='Software Heritage developers',
author_email='swh-devel@inria.fr',
url='https://forge.softwareheritage.org/source/swh-deposit/',
packages=['swh.deposit'],
packages=['swh.deposit',
'swh.deposit.fixtures',
'swh.deposit.migrations',
'swh.deposit.templates',
'swh.deposit.templates.deposit'],
scripts=[], # scripts to package
install_requires=parse_requirements(),
setup_requires=['vcversioner'],
......
......@@ -48,7 +48,7 @@ comment on column deposit_type.name is 'Human readable name for the deposit type
create table deposit(
id bigserial primary key,
reception_date timestamptz not null,
complete_date timestamptz not null,
complete_date timestamptz,
type serial not null references deposit_type(id),
external_id text not null,
status deposit_status not null,
......
Metadata-Version: 1.0
Name: swh.deposit
Version: 0.0.2
Version: 0.0.3
Summary: Software Heritage Deposit Server
Home-page: https://forge.softwareheritage.org/source/swh-deposit/
Author: Software Heritage developers
......
......@@ -15,14 +15,27 @@ debian/control
debian/copyright
debian/rules
debian/source/format
doc/specs.md
resources/deposit/server.yml
sql/swh-schema.sql
swh/manage.py
swh.deposit.egg-info/PKG-INFO
swh.deposit.egg-info/SOURCES.txt
swh.deposit.egg-info/dependency_links.txt
swh.deposit.egg-info/requires.txt
swh.deposit.egg-info/top_level.txt
swh/deposit/backend.py
swh/deposit/server.py
swh/deposit/templates/service_document.xml
\ No newline at end of file
swh/deposit/__init__.py
swh/deposit/admin.py
swh/deposit/apps.py
swh/deposit/models.py
swh/deposit/settings.py
swh/deposit/tests.py
swh/deposit/urls.py
swh/deposit/views.py
swh/deposit/wsgi.py
swh/deposit/fixtures/__init__.py
swh/deposit/fixtures/deposit_data.yaml
swh/deposit/migrations/0001_initial.py
swh/deposit/migrations/__init__.py
swh/deposit/templates/__init__.py
swh/deposit/templates/deposit/__init__.py
swh/deposit/templates/deposit/service_document.xml
\ No newline at end of file
aiohttp
click
jinja
django
retrying
swh.core>=0.0.14
vcversioner
from django.contrib import admin
from .models import Client, DepositType, Deposit, DepositRequest
admin.site.register(Client)
admin.site.register(DepositType)
admin.site.register(Deposit)
admin.site.register(DepositRequest)
from django.apps import AppConfig
class DepositConfig(AppConfig):
name = 'swh.deposit'
# Copyright (C) 2017 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information
from functools import wraps
import psycopg2
import psycopg2.extras
psycopg2.extensions.register_adapter(dict, psycopg2.extras.Json)
def autocommit(fn):
@wraps(fn)
def wrapped(self, *args, **kwargs):
autocommit = False
if 'cursor' not in kwargs or not kwargs['cursor']:
autocommit = True
kwargs['cursor'] = self.cursor()
try:
ret = fn(self, *args, **kwargs)
except:
if autocommit:
self.rollback()
raise
if autocommit:
self.commit()
return ret
return wrapped
class DepositBackend():
"""Backend for the Software Heritage deposit database.
"""
def __init__(self, dbconn):
self.db = None
self.dbconn = dbconn
self.reconnect()
def reconnect(self):
if not self.db or self.db.closed:
self.db = psycopg2.connect(
dsn=self.dbconn,
cursor_factory=psycopg2.extras.RealDictCursor,
)
def cursor(self):
"""Return a fresh cursor on the database, with auto-reconnection in
case of failure
"""
cur = None
# Get a fresh cursor and reconnect at most three times
tries = 0
while True:
tries += 1
try:
cur = self.db.cursor()
cur.execute('select 1')
break
except psycopg2.OperationalError:
if tries < 3:
self.reconnect()
else:
raise
return cur
def commit(self):
"""Commit a transaction"""
self.db.commit()
def rollback(self):
"""Rollback a transaction"""
self.db.rollback()
deposit_keys = [
'reception_date', 'complete_date', 'type', 'external_id',
'status', 'client_id',
]
def _format_query(self, query, keys):
"""Format a query with the given keys"""
query_keys = ', '.join(keys)
placeholders = ', '.join(['%s'] * len(keys))
return query.format(keys=query_keys, placeholders=placeholders)
@autocommit
def deposit_add(self, deposit, cursor=None):
"""Create a new deposit.
A deposit is a dictionary with the following keys:
type (str): an identifier for the deposit type
reception_date (date): deposit's reception date
complete_date (date): deposit's date when the deposit is
deemed complete
external_id (str): the external identifier in the client's
information system
status (str): deposit status
client_id (integer): client's identifier
"""
query = self._format_query(
"""insert into deposit ({keys}) values ({placeholders})""",
self.deposit_keys,
)
cursor.execute(query, [deposit[key] for key in self.deposi_keys])
@autocommit
def deposit_get(self, id, cursor=None):
"""Retrieve the task type with id
"""
query = self._format_query(
"select {keys} from deposit where type=%s",
self.deposit_keys,
)
cursor.execute(query, (id,))
ret = cursor.fetchone()
return ret
@autocommit
def request_add(self, request, cursor=None):
pass
@autocommit
def request_get(self, deposit_id, cursor=None):
pass
@autocommit
def client_list(self, cursor=None):
cursor.execute('select id, name from client')
return {row['name']: row['id'] for row in cursor.fetchall()}
@autocommit
def client_get(self, id, cursor=None):
cursor.execute('select id, name, credential from client where id=%s',
(id, ))
return cursor.fetchone()
- model: deposit.dbversion
pk: 1
fields:
release: '2017-07-31 08:10:00.303000+00:00'
description: Work in Progress
- model: deposit.client
pk: 1
fields:
name: hal
credential: null
- model: deposit.deposittype
pk: 1
fields:
name: hal
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2017-07-31 09:43
from __future__ import unicode_literals
import django.contrib.postgres.fields.jsonb
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Client',
fields=[
('id', models.BigAutoField(primary_key=True, serialize=False)),
('name', models.TextField()),
('credential', models.BinaryField(blank=True, null=True)),
],
options={
'db_table': 'client',
},
),
migrations.CreateModel(
name='Dbversion',
fields=[
('version', models.IntegerField(primary_key=True, serialize=False)),
('release', models.DateTimeField(default=django.utils.timezone.now, null=True)),
('description', models.TextField(blank=True, null=True)),
],
options={
'db_table': 'dbversion',
},
),
migrations.CreateModel(
name='Deposit',
fields=[
('id', models.BigAutoField(primary_key=True, serialize=False)),
('reception_date', models.DateTimeField()),
('complete_date', models.DateTimeField(null=True)),
('external_id', models.TextField()),
('client_id', models.BigIntegerField()),
('swh_id', models.TextField(blank=True, null=True)),
('status', models.TextField(choices=[('partial', 'partial'), ('expired', 'expired'), ('ready', 'ready'), ('injecting', 'injecting'), ('success', 'success'), ('failure', 'failure')], default='partial')),
],
options={
'db_table': 'deposit',
},
),
migrations.CreateModel(
name='DepositRequest',
fields=[
('id', models.BigAutoField(primary_key=True, serialize=False)),
('metadata', django.contrib.postgres.fields.jsonb.JSONField(null=True)),
('deposit', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='deposit.Deposit')),
],
options={
'db_table': 'deposit_request',
},
),
migrations.CreateModel(
name='DepositType',
fields=[
('id', models.BigAutoField(primary_key=True, serialize=False)),
('name', models.TextField()),
],
options={
'db_table': 'deposit_type',
},
),
migrations.AddField(
model_name='deposit',
name='type',
field=models.ForeignKey(db_column='type', on_delete=django.db.models.deletion.DO_NOTHING, to='deposit.DepositType'),
),
]
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment