aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fatcat/schema.py68
-rw-r--r--webface/index.html262
-rw-r--r--webface/notes.txt8
3 files changed, 338 insertions, 0 deletions
diff --git a/fatcat/schema.py b/fatcat/schema.py
new file mode 100644
index 00000000..cdc98ccf
--- /dev/null
+++ b/fatcat/schema.py
@@ -0,0 +1,68 @@
+
+from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
+
+metadata = MetaData()
+
+# TODO: http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/mixins.html
+
+work_id = Table('work_id', metadata,
+ Column('id', Integer, primary_key=True, autoincrement=False),
+ Column('revision', ForeignKey('work_revision.id')),
+ )
+
+work_revision = Table('work_revision', metadata,
+ Column('id', Integer, primary_key=True, autoincrement=True),
+ Column('previous', ForeignKey('work_revision.id'), nullable=True),
+ Column('state', enum('normal', 'redirect', 'removed')),
+ Column('redirect_id', ForeignKey('work_id.id'), nullable=True)),
+ Column('edit_id'), ForeignKey('edit.id')),
+
+ Column('title', String),
+ Column('work_type', ForeignKey()),
+ Column('date', String),
+ Column('journal', String),
+ Column('doi', String),
+ )
+
+creator_id = Table('creator_id', metadata,
+ Column('id', Integer, primary_key=True, autoincrement=False),
+ Column('revision', ForeignKey('creator_revision.id')),
+ )
+
+creator_revision = Table('creator_revision', metadata,
+ Column('id', Integer, primary_key=True, autoincrement=True),
+ Column('previous', ForeignKey('creator_revision.id'), optional=True),
+ Column('state', enum('normal', 'redirect', 'removed')),
+ Column('redirect_id', ForeignKey('creator_id.id'), optional=True)),
+ Column('edit_id'), ForeignKey('edit.id')),
+
+ Column('name', String),
+ Column('sortname', String),
+ )
+
+authorship = Table('authorship', metadata,
+ Column('id', Integer, primary_key=True, autoincrement=True),
+ Column('work_rev', ForeignKey('work_revision.id'), nullable=False),
+ Column('creator_id', ForeignKey('creator_id.id'), nullable=False),
+ )
+
+edit = Table('edit', metadata,
+ Column('id', Integer, primary_key=True, autoincrement=True),
+ Column('edit_group', ForeignKey('edit_group.id')),
+ Column('editor', ForeignKey('editor.id')),
+ )
+
+edit_group = Table('edit_group', metadata,
+ Column('id', Integer, primary_key=True, autoincrement=True),
+ )
+
+editor = Table('editor', metadata,
+ Column('id', Integer, primary_key=True, autoincrement=True),
+ Column('username', String),
+ )
+
+changelog = Table('changelog', metadata,
+ Column('id', Integer, primary_key=True, autoincrement=True),
+ Column('edit_id', ForeignKey('edit.id')),
+ Column('timestamp', Integer),
+ )
diff --git a/webface/index.html b/webface/index.html
new file mode 100644
index 00000000..6e269e38
--- /dev/null
+++ b/webface/index.html
@@ -0,0 +1,262 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width">
+
+ <title> </title>
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.2.13/dist/semantic.min.css">
+ <script
+ src="https://code.jquery.com/jquery-3.1.1.min.js"
+ integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
+ crossorigin="anonymous"></script>
+ <script src="https://cdn.jsdelivr.net/npm/semantic-ui@2.2.13/dist/semantic.min.js"></script>
+
+</head>
+<body>
+
+<div class="ui fixed inverted menu">
+ <div class="ui container">
+ <a href="#" class="header item">
+ <!-- <img class="logo" src="assets/images/logo.png"> -->
+ Project Name
+ </a>
+ <a href="#" class="item">Home</a>
+ <div class="ui simple dropdown item">
+ Dropdown <i class="dropdown icon"></i>
+ <div class="menu">
+ <a class="item" href="#">Link Item</a>
+ <a class="item" href="#">Link Item</a>
+ <div class="divider"></div>
+ <div class="header">Header Item</div>
+ <div class="item">
+ <i class="dropdown icon"></i>
+ Sub Menu
+ <div class="menu">
+ <a class="item" href="#">Link Item</a>
+ <a class="item" href="#">Link Item</a>
+ </div>
+ </div>
+ <a class="item" href="#">Link Item</a>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="ui main text container">
+
+<div class="ui segment">
+<h1 class="ui header">Adding a New Thing</h1>
+
+<form class="ui form" id="add_work_form">
+
+ <h3 class="ui dividing header">The Basics</h3>
+
+ <div class="ui huge field required">
+ <label>Title</label>
+ <input name="work_title" type="text" placeholder="Title of Work (in English)">
+ </div>
+
+ <div class="ui field required">
+ <label>Type of Work</label>
+ <select class="ui dropdown" id="work_type">
+ <option value="">Primary Type</option>
+ <option value="journal-article">Journal Article</option>
+ <option value="book">Book</option>
+ <option value="book-chapter">Book Chapter</option>
+ <option value="dataset">Dataset</option>
+ <option value="dissertation">Thesis or Dissertation</option>
+ <option value="monograph">Monograph</option>
+ <option value="proceedings-article">Conference Proceeding</option>
+ <option value="report">Report</option>
+ <option value="other">Other</option>
+ </select>
+ </div>
+
+ <!-- Primary Creators/Authors -->
+ <div class="ui field search" id="work_creators">
+ <label>Primary Creator(s)</label>
+ <div class="ui icon input">
+ <input class="prompt" type="text" placeholder="Search...">
+ <i class="search icon"></i>
+ </div>
+ <div class="results"></div>
+ </div>
+
+ <!-- Description (not an abstract) -->
+ <div class="ui field">
+ <label>Description</label>
+ <div class="field">
+ <label>Not an abstract...</label>
+ <textarea rows="2"></textarea>
+ </div>
+ </div>
+
+ <!-- Primary/Original Language -->
+ <div class="field">
+ <label>Primary Language</label>
+ <select class="ui search select dropdown" id="language-select">
+ <option value="">Select if Appropriate</option>
+ <option value="en">English</option>
+ <option value="es">Spanish</option>
+ </select>
+ </div>
+
+ <!-- Subject / Categorization / Tags -->
+ <div class="field">
+ <label>Subject</label>
+ <select multiple="" class="ui dropdown" id="subjects">
+ <option value="">Select Subject/Tags</option>
+ <option value="AF">Afghanistan</option>
+ <option value="AX">Ă…land Islands</option>
+ <option value="AL">Albania</option>
+ <option value="DZ">Algeria</option>
+ <option value="AS">American Samoa</option>
+ <option value="AD">Andorra</option>
+ <option value="AO">Angola</option>
+ </select>
+ </div>
+
+
+ <h3 class="ui dividing header">Primary Release / Edition</h3>
+
+ <!-- Contributors (and how) -->
+ <div class="ui field search" id="release_creators">
+ <label>Primary Creator(s)</label>
+ <div class="ui icon input">
+ <input class="prompt" type="text" placeholder="Search...">
+ <i class="search icon"></i>
+ </div>
+ <div class="results"></div>
+ </div>
+
+ <!-- Date -->
+ <!-- Container / Part-Of -->
+ <!-- Publisher -->
+ <!-- Identifier -->
+ <!-- Language -->
+ <!-- Type / Media -->
+ <!-- Issue / Volume / Pages / Chapter -->
+
+ <!-- Anything Else? -->
+ <h3 class="ui dividing header">Anything Else?</h3>
+
+ <!-- File / Copy / URL -->
+ <!-- Citations -->
+
+<div class="ui submit button">Create Work</div>
+</form>
+
+</div>
+</div>
+
+<!-- Form validation code -->
+<script>
+$(document).ready(function() {
+
+ $('#add_work_form')
+ .form({
+ fields: {
+ name: {
+ identifier: 'name',
+ rules: [
+ {
+ type : 'empty',
+ prompt : 'Please enter your name'
+ }
+ ]
+ },
+ skills: {
+ identifier: 'skills',
+ rules: [
+ {
+ type : 'minCount[2]',
+ prompt : 'Please select at least two skills'
+ }
+ ]
+ },
+ gender: {
+ identifier: 'gender',
+ rules: [
+ {
+ type : 'empty',
+ prompt : 'Please select a gender'
+ }
+ ]
+ },
+ username: {
+ identifier: 'username',
+ rules: [
+ {
+ type : 'empty',
+ prompt : 'Please enter a username'
+ }
+ ]
+ },
+ password: {
+ identifier: 'password',
+ rules: [
+ {
+ type : 'empty',
+ prompt : 'Please enter a password'
+ },
+ {
+ type : 'minLength[6]',
+ prompt : 'Your password must be at least {ruleValue} characters'
+ }
+ ]
+ },
+ terms: {
+ identifier: 'terms',
+ rules: [
+ {
+ type : 'checked',
+ prompt : 'You must agree to the terms and conditions'
+ }
+ ]
+ }
+ }
+ })
+ ;
+
+ var example_authors = [
+ { title: 'Andorra' },
+ { title: 'United Arab Emirates' },
+ { title: 'Afghanistan' },
+ { title: 'Antigua' },
+ { title: 'Anguilla' },
+ { title: 'Albania' },
+ { title: 'Armenia' },
+ { title: 'Netherlands Antilles' },
+ { title: 'Angola' },
+ { title: 'Argentina' },
+ { title: 'American Samoa' },
+ { title: 'Austria' },
+ { title: 'Australia' },
+ { title: 'Aruba' },
+ ];
+
+ $('#work_creators')
+ .search({
+ source: example_authors
+ })
+ ;
+
+ $('#release_creators')
+ .search({
+ source: example_authors
+ })
+ ;
+
+ $('#work_type').dropdown();
+ $('#subjects').dropdown();
+ $('#language-select').dropdown();
+
+ console.log("Page loaded");
+
+});
+</script>
+
+</body>
+</html>
diff --git a/webface/notes.txt b/webface/notes.txt
new file mode 100644
index 00000000..8ed47d0b
--- /dev/null
+++ b/webface/notes.txt
@@ -0,0 +1,8 @@
+
+tachyons is nice for simple css-only stuff, but let's use "Semantic UI" because
+it has a bunch of javascript form stuff.
+
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/semantic-ui/2.2.13/semantic.min.css">
+ <script src="https://cdn.jsdelivr.net/semantic-ui/2.2.13/semantic.min.js"></script>
+
+