diff --git a/modules/hudozka-api/src/controllers/person.ts b/modules/hudozka-api/src/controllers/person.ts deleted file mode 100644 index 605947df..00000000 --- a/modules/hudozka-api/src/controllers/person.ts +++ /dev/null @@ -1,60 +0,0 @@ -import Teacher from '../core/Teacher' -import { encodePerson } from '../factory/person' -import { Request, Response } from 'express' -import { prioritySort } from '../lib/sort' - -export async function getItem(req: Request, res: Response) { - const id = req.params.slug - const data = await Teacher.findById(id) - - if (data) { - res.json(encodePerson(data)) - } else { - res.status(404) - res.json({ - error: `Resource ${id} not found` - }) - } -} - -export async function getAll(req: Request, res: Response) { - const order = [ - 'mg-timasheva', - 'va-sarzhin', - 'od-gogoleva', - 'my-valkova', - 'nv-andreeva', - 'vv-voronova', - ] - const teachersSorted = prioritySort.bind(null, [...order], t => t.id) - - const teachers = await Teacher.find({ hidden: false }) - const data = teachersSorted(teachers).map(encodePerson) - - if (data) { - res.json({ - items: data, - }) - } else { - res.status(404) - res.json({ - error: `Not found` - }) - } -} - -export async function getUrls(req: Request, res: Response) { - const data = await Teacher.find({}) - - if (data) { - const items = data.map(x => `/teacher/${x.id}`) - res.json({ - items - }) - } else { - res.status(404) - res.json({ - error: `Not found` - }) - } -} diff --git a/modules/hudozka-api/src/core/Config.ts b/modules/hudozka-api/src/core/Config.ts index db3188ff..086d6c23 100644 --- a/modules/hudozka-api/src/core/Config.ts +++ b/modules/hudozka-api/src/core/Config.ts @@ -20,7 +20,6 @@ export default class Config { public file: any public server: any public articlesPerPage: any - public collectiveOrder: any public articleCardDefaultPreview: any public collectiveImage: any public redirect: any @@ -30,7 +29,6 @@ export default class Config { this.file = file this.server = data.server this.articlesPerPage = data.articlesPerPage || 5 - this.collectiveOrder = data.collectiveOrder || [] this.articleCardDefaultPreview = data.articleCardDefaultPreview this.collectiveImage = data.collectiveImage diff --git a/modules/hudozka-api/src/core/Teacher.ts b/modules/hudozka-api/src/core/Teacher.ts deleted file mode 100644 index 582ec73f..00000000 --- a/modules/hudozka-api/src/core/Teacher.ts +++ /dev/null @@ -1,87 +0,0 @@ -import Data from './Data' -import Image from './Image' -import { find, findOne } from '../lib/store' - -const store = () => Data.getStore('Teacher') - -export default class Teacher { - static async find(query, options = {}): Promise { - const items = await find(store(), query, options as any) - - return Promise.all(items.map(processProfile)) - } - - static async findById(id) { - const data = await findOne(store(), { id }) - if (!data) return null - - return processProfile(data) - } - - public id: any - public post: any - public file: any - public edu: any - public picture: any - public preview: any - public diploma: any - public position: any - public name: any - public status: any - public hash: any - public url: any - - constructor(data) { - this.id = data.id - this.post = data.post - this.file = data.file - this.edu = data.edu - this.picture = data.picture - this.preview = data.preview - this.diploma = data.diploma - this.position = data.position - this.name = data.name - this.status = data.status - this.hash = data.hash - - this.url = `/teacher/${this.id}` - } - - /** - * - * "First Middle Last" -> "F. M. Last" - * - * @returns {string} - */ - shortName() { - const f = i => i.replace(/^(.).+/, '$1') - const [first, middle, last] = this.splitName() - - return `${f(first)}. ${f(middle)}. ${last}` - } - - /** - * - * "First Middle Last" -> ["First", "Middle", "Last"] - * - * @returns {Array|{index: number, input: string}} - */ - splitName() { - const name = this.name - const m = /(.+)\s(.+)\s(.+)/.exec(name) - return m.slice(1) - } -} - -const processProfile = async profile => { - const imageId = profile.picture - const previewId = profile.preview - const picture = await Image.findById(imageId) - const preview = await Image.findById(previewId) - - return new Teacher({ - ...profile, - picture, - preview, - }) -} diff --git a/modules/hudozka-api/src/core/pages.js b/modules/hudozka-api/src/core/pages.js deleted file mode 100644 index b140f10f..00000000 --- a/modules/hudozka-api/src/core/pages.js +++ /dev/null @@ -1,19 +0,0 @@ -import {c} from '../core/db'; - -const PAGES = 'pages'; - -export async function getPageUrls() { - return await c(PAGES) - .find({}, {url: 1}) - .toArray(); -} - -/** - * Find a person by it's id - * - * @param {string} url - * @returns {Promise|*} - */ -export async function getPage(url) { - return await c(PAGES).findOne({url: url}); -} diff --git a/modules/hudozka-api/src/db.ts b/modules/hudozka-api/src/db.ts index 048e2813..bd3705e4 100644 --- a/modules/hudozka-api/src/db.ts +++ b/modules/hudozka-api/src/db.ts @@ -30,7 +30,6 @@ function init(db: Db) { Data.setStore('Article', db.collection('articles')) Data.setStore('Album', db.collection('albums')) Data.setStore('Image', db.collection('images')) - Data.setStore('Teacher', db.collection('collective')) Data.setStore('Document', db.collection('documents')) Data.setStore('Settings', db.collection('settings')) diff --git a/modules/hudozka-api/src/factory/person.ts b/modules/hudozka-api/src/factory/person.ts deleted file mode 100644 index 21d6f410..00000000 --- a/modules/hudozka-api/src/factory/person.ts +++ /dev/null @@ -1,13 +0,0 @@ -import ImageArtifactType from '../core/ImageArtifactType' -import { encodeImage } from './image' -const profilePicture = profile => profile.picture.getPicture(ImageArtifactType.BIG) - -export function encodePerson(person) { - return { - ...person, - shortName: person.shortName(), - name: person.splitName(), - picture: profilePicture(person), - preview: encodeImage(person.picture), - } -} \ No newline at end of file diff --git a/modules/hudozka-api/src/lib/sort.js b/modules/hudozka-api/src/lib/sort.js index 3fa95c00..e1287244 100644 --- a/modules/hudozka-api/src/lib/sort.js +++ b/modules/hudozka-api/src/lib/sort.js @@ -1,17 +1,3 @@ -function prioritySort(priority, key, list) { - priority = priority.reverse() - - let weight = i => { - const p = key(i) - const index = priority.indexOf(p) - return index > -1 - ? index + 1 - : 0 - } - - return sort(list, weight) -} - function sort(list, fn, reverse = false) { return list .map(i => [fn(i), i]) @@ -32,6 +18,5 @@ function sortBy(fn, reverse = false) { } } -exports.prioritySort = prioritySort exports.sortBy = sortBy exports.sort = sort diff --git a/modules/hudozka-api/src/server.ts b/modules/hudozka-api/src/server.ts index e6a335a7..5d6f28f6 100644 --- a/modules/hudozka-api/src/server.ts +++ b/modules/hudozka-api/src/server.ts @@ -1,7 +1,6 @@ import { config } from 'dotenv' import express from 'express' import { connect } from './db' -import * as person from './controllers/person' import * as article from './controllers/article' import * as album from './controllers/album' import * as schedule from './controllers/schedule' @@ -25,10 +24,6 @@ async function main() { } const app = express() - app.get('/persons', person.getAll) - app.get('/persons/urls', person.getUrls) - app.get('/persons/:slug', person.getItem) - app.get('/articles', article.getAll) app.get('/articles/urls', article.getUrls) app.get('/articles/:slug', article.getItem) diff --git a/modules/hudozka-api/src/server/collective.js b/modules/hudozka-api/src/server/collective.js deleted file mode 100644 index 98dfb699..00000000 --- a/modules/hudozka-api/src/server/collective.js +++ /dev/null @@ -1,18 +0,0 @@ -const { collection } = require('../db') -// import { collection } from '../core/db' - -export async function getCollective(query = {}) { - return await collection('collective') - .find(query) - .toArray(); -} - -/** - * Find a person by it's id - * - * @param id - * @returns {Promise|*} - */ -export async function getPerson(id) { - return await collection('collective').findOne({ id: id }); -} diff --git a/modules/hudozka-api/src/server/schedule.ts b/modules/hudozka-api/src/server/schedule.ts index f7b07a1b..ad4cef12 100644 --- a/modules/hudozka-api/src/server/schedule.ts +++ b/modules/hudozka-api/src/server/schedule.ts @@ -1,5 +1,4 @@ import { createMap } from '../utils/common' -import { getCollective } from './collective' import { scheduleDate, getPeriod as schedulePeriod, @@ -96,7 +95,7 @@ function migrate10to20(schedule) { async function migrate20to30(schedule) { const days = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat']//, 'sun'] - const persons = await getCollective() + const persons = [] const person = createMap(i => i.id, persons) const week = week => days diff --git a/modules/sync/settings.py b/modules/sync/settings.py index a3841cf8..87f87591 100644 --- a/modules/sync/settings.py +++ b/modules/sync/settings.py @@ -41,15 +41,6 @@ database_uri = value('database_uri') # env('MONGO_URI') skip_unchanged = value('skip_unchanged') -person_uri = { - 'Н.В.Андреева': 'nv-andreeva', - 'И.Н.Втюрина': 'in-vturina', - 'О.Д.Гоголева': 'od-gogoleva', - 'В.А.Саржин': 'va-sarzhin', - 'Р.К.Тимашев': 'rk-timashev', - 'А.С.Тимашева': 'as-timasheva', -} - image_processing_enabled = value('image_processing') album_html_img_class = 'hudozka-product' @@ -104,7 +95,6 @@ collection_images = 'images' collection_documents = 'documents' collection_schedules = 'schedules' collection_articles = 'articles' -collection_collective = 'collective' collection_albums = 'albums' collection_pages = 'pages' @@ -113,7 +103,6 @@ hash_salt_pages = '4' hash_salt_albums = '1' hash_salt_documents = '4' hash_salt_images = '5' -hash_salt_person = '4' provider_name = value('provider')['name'] # env('SYNC_PROVIDER', 'fs') provider_root = value('provider')['root'] # env('SYNC_PROVIDER', 'fs') @@ -124,7 +113,6 @@ dir_settings = './Settings' dir_documents = './Documents' dir_schedules = './Schedules' dir_articles = './Articles' -dir_persons = './Collective' dir_albums = './Gallery' dir_pages = './Pages' dir_images = './Images' diff --git a/modules/sync/sync.py b/modules/sync/sync.py index be97324e..02017656 100644 --- a/modules/sync/sync.py +++ b/modules/sync/sync.py @@ -11,7 +11,6 @@ from sync.models.Image import Image from sync.models.Album import Album from sync.models.Article import Article from sync.models.Page import Page -from sync.models.Person import Person from sync.models.Schedule import Schedule from sync.models.Settings import Settings @@ -58,13 +57,6 @@ async def run(run_interval=0): ) sync_pages.set_options(True, True, True) - sync_persons = Sync( - provider=io(settings.provider_root), - model=Person, - ) - sync_persons.set_options(True, True, True) - sync_persons.validate_urls = False - sync_articles = Sync( provider=io(settings.provider_root), model=Article, @@ -105,7 +97,6 @@ async def run(run_interval=0): await asyncio.wait([ run_sync(sync_documents), run_sync(sync_pages), - run_sync(sync_persons), run_sync(sync_articles), run_sync(sync_schedules), run_sync(sync_albums), diff --git a/modules/sync/sync/models/Person.py b/modules/sync/sync/models/Person.py deleted file mode 100644 index 79836453..00000000 --- a/modules/sync/sync/models/Person.py +++ /dev/null @@ -1,130 +0,0 @@ -import logging - -import os - -import settings -from db import collection -from sync import create_post -from sync.data import Provider -from sync.models import Model -from sync.models.Image import Image - -from utils.fn import swap_ext -from utils.hash import hash_str -from utils.io import read_yaml_md, parse_yaml_front_matter -from utils.text.transform import url_encode_text - -logger = logging.getLogger(settings.name + '.Person') -store = collection(settings.collection_collective) - - -class Person(Model): - @staticmethod - async def find(query): - return store.find(query) - - @staticmethod - async def delete(query): - return store.find_one_and_delete(query) - - @staticmethod - async def scan(provider): - scan_dir = settings.dir_persons - documents = provider.type_filter(scan_dir, '.md') - documents = [Person.read(provider, i) for i in documents] - return documents - - @staticmethod - def read(provider, path): - params = get_manifest(provider, path) - - return Person( - provider, - path, - params=params, - ) - - def __init__(self, provider, file, params=None): - self.__hash_salt = settings.hash_salt_person - self.__hash_keys = ['id', 'url'] - - self.__id_template: str = '{category}-{file}' - self.__url_template: str = settings.document_url_template - self.__url_preview_template: str = settings.document_url_preview_template - - self.picture = None - self.preview = None - self.post = None - self.images = None - self.documents = None - - super().__init__(provider, store, file, params) - - def init(self): - pass - self.__set_id() - self.__set_hash() - - async def build(self, **kwargs): - sizes = kwargs['sizes'] - image_path = self._get_relpath(self.get_param('picture')) - - self.picture = await Image.new(self.provider, image_path, sizes) - - markdown_post = self.get_param('content') - post, images, documents = await create_post(self.provider, self.get_param('folder'), markdown_post, sizes) - self.post = post - self.images = images - self.documents = documents - - if self.has_param('preview'): - preview = self.get_param('preview') - preview = self._get_relpath(preview) - self.preview = await Image.new(self.provider, preview, sizes) - - def bake(self): - return { - **self.params, - 'post': self.post, - 'images': [x.ref for x in self.images], - 'documents': [x.ref for x in self.documents], - 'id': self.id, - 'hash': self.hash, - 'file': self.file, - 'picture': self.picture.ref, - 'preview': self.preview.ref if self.preview else None, - } - - def __set_id(self): - if 'id' in self.params: - self.id = self.params['id'] - else: - self.id = url_encode_text(self.params['name']) - - def __set_hash(self): - files = [self.file] - files.append(self._get_relpath(self.get_param('picture'))) - - if self.has_param('preview'): - files.append(self._get_relpath(self.get_param('preview'))) - - hashes = [self.provider.hash(x) for x in files] - self.hash = hash_str( - self.__hash_salt + ''.join(hashes) - ) - - def __str__(self): - return f'' - - -def get_manifest(provider: Provider, path: str) -> dict: - data = provider.read(path).read().decode('utf-8') - - manifest = parse_yaml_front_matter(data) - return { - **manifest, - 'picture': manifest['picture'] if 'picture' in manifest else os.path.basename(swap_ext('.jpg')(path)), - 'preview': manifest['preview'] if 'preview' in manifest else os.path.basename(swap_ext('.jpg')(path)), - 'folder': os.path.dirname(path), - 'hidden': manifest['hidden'] if 'hidden' in manifest else False, - } diff --git a/modules/sync/sync/models/product.py b/modules/sync/sync/models/product.py index 42534242..0eb373fd 100644 --- a/modules/sync/sync/models/product.py +++ b/modules/sync/sync/models/product.py @@ -1,6 +1,5 @@ import settings from db import collection -from sync.core.person import SyncPerson from utils.text.transform import interpolate_swift @@ -15,14 +14,6 @@ def resolve_value(param, store): return store(i) -def resolve_teacher(i): - sync = SyncPerson( - collection(settings.collection_collective), - None, - '' - ) - return resolve_value(i, lambda teacher_id: sync.read({'id': teacher_id})) - def create_product(doc): # author, image, title, awards, teacher, date @@ -33,8 +24,4 @@ def create_product(doc): product = {**doc} # unpop_image(product) - # product['teacher'] = resolve_teacher(doc['teacher']) - # if (product['teacher']): - # unpop_teacher(product) - return product diff --git a/pages/collective.tsx b/pages/collective.tsx index 98cc04c9..9dec53c3 100644 --- a/pages/collective.tsx +++ b/pages/collective.tsx @@ -1,16 +1,32 @@ import Head from 'next/head' -import { get } from 'lodash' import { App } from 'src/components/App' import { Meta } from 'src/components/Meta' import { CollectiveImage } from 'src/components/CollectiveImage' import { meta } from 'src/lib/meta' -import { IMeta, Person } from 'src/types' -import { createApiUrl, requestGet, IResponseItems } from 'src/next-lib' +import { IMeta, IPage, ImageDefinition } from 'src/types' +import { createApiUrl, requestGet } from 'src/next-lib' import { NextPage, NextPageContext } from 'next' import { CardGrid } from 'src/components/CardGrid' import { Card } from 'src/components/Card' import { Block } from 'src/components/Block' +const persons = [ + '/teacher/mg-timasheva', + '/teacher/va-sarzhin', + '/teacher/od-gogoleva', + '/teacher/nv-andreeva', + '/teacher/vv-voronova', + '/teacher/ea-burovtseva', + '/teacher/sa-latipova', + '/teacher/iv-khramov', + '/teacher/ma-khramova', + // АС Тимашева + // ЕЮ Тарасова + // ИН Втюрина + // МЮ Валькова + // РК Тимашев +] + type CardData = { title: string caption?: string @@ -83,25 +99,29 @@ const Page: NextPage = props => { } export const unstable_getStaticProps = async (ctx: NextPageContext) => { - const res = await requestGet>(createApiUrl('/api/persons'), null) const title = 'Преподаватели Шлиссельбургской ДХШ' const imageFile = 'Images/HudozkaCollective2017.jpg' - const resImage = await requestGet(createApiUrl(`/api/image?file=${imageFile}`), null) - const image = get(resImage, 'artifacts.large', null) - const data: CardData[] = (res?.items || []) + const resImage = await requestGet(createApiUrl(`/api/image?file=${imageFile}`), null) + const image = resImage?.artifacts.large + + const pages = await Promise.all(persons + .map(page => requestGet(createApiUrl(`/api/page?page=${page}`), null)) + ) + const data: CardData[] = pages + .filter(Boolean) .map(x => { - const title = `${x.name[0]} ${x.name[1]} ${x.name[2]}` + const image = x.preview.artifacts.large + return { - title, - caption: x.position, + title: x.title, + caption: x.description, href: x.url, - imageSrc: x.picture.src, + imageSrc: image.src, imageAlt: title, - imageSrcSet: '', + imageSrcSet: image.set.join(' ') } }) - return { props: { data, diff --git a/pages/teacher/[person].tsx b/pages/teacher/[person].tsx deleted file mode 100644 index edfb04eb..00000000 --- a/pages/teacher/[person].tsx +++ /dev/null @@ -1,90 +0,0 @@ -import Head from 'next/head' -import { App } from 'src/components/App' -import { Article } from 'src/components/Article' -import { Meta } from 'src/components/Meta' -import { MetaBuilder } from 'src/lib/meta' -import { createApiUrl, requestGet, IResponseItems } from 'src/next-lib' -import { NextPage } from 'next' -import { IMeta, Person } from 'src/types' -import { Html } from 'src/components/Html' - -interface IProps { - title: string - meta: IMeta - person: any -} - -const Index: NextPage = props => { - if (!props?.person?.post) { - console.log('kek error', props) - - return null - } - - return ( - - - {props.title} - - - - {!props.person.post ? null : ( -
- -
- )} -
- ) -} - -export const unstable_getStaticProps = async (ctx: any) => { - const id = ctx.params.person - if (!id) { - throw new Error('sry') - } - - const person = await requestGet(createApiUrl(`/api/persons/${id}`), null) - if (!person?.post) { - throw new Error(`post kek ${id}`) - } - - const title = person.name.join(' ') - const meta = (new MetaBuilder()) - .setImage(person.preview) - .setTitle(title) - .setDescription(person.position) - .build() - - return { - props: { - person, - title, - meta, - } - } -} - -export const unstable_getStaticPaths = async () => { - const urls = await requestGet>(createApiUrl(`/api/persons/urls`), null) - - return { - paths: urls.items - .map(x => x.replace('/teacher/', '')) - .map(person => ({ - params: { - person, - }, - })), - } -} - -export default Index diff --git a/scripts/sitemap.js b/scripts/sitemap.js index b95c59e8..2d256a57 100644 --- a/scripts/sitemap.js +++ b/scripts/sitemap.js @@ -41,15 +41,6 @@ async function getAlbumsUrls() { })) } -async function getTeacherUrls() { - const res = await api.get('/api/persons/urls') - - return res.data.items.map(url => ({ - changefreq: 'monthly', - url, - })) -} - async function getArticleUrls() { const res = await api.get('/api/articles/urls') @@ -64,7 +55,6 @@ async function getArticleUrls() { getMenuUrls(), getPageUrls(), getAlbumsUrls(), - getTeacherUrls(), getArticleUrls(), ]) urls = urls.reduce((urls, i) => urls.concat(i)) diff --git a/src/config.ts b/src/config.ts index 3e3e7718..7f139be8 100644 --- a/src/config.ts +++ b/src/config.ts @@ -35,10 +35,6 @@ export default { name: 'Школа', href: '/', }, - { - name: 'Расписание', - href: '/schedule', - }, { name: 'Поступление', href: '/join',