Skip to content

Commit 19e87f7

Browse files
committed
add on sql position for folder and bookmarks for ordering
1 parent 90e3f83 commit 19e87f7

File tree

4 files changed

+65
-29
lines changed

4 files changed

+65
-29
lines changed

SQL/sqlalchemy/mptt/CRUD.py

+16-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from datetime import datetime
2+
import os
23

34
import bookmarks_parser
45
from sqlalchemy import create_engine
@@ -7,7 +8,7 @@
78

89
from SQL.sqlalchemy.mptt.model import Folder, Bookmark
910

10-
engine = create_engine('postgresql://postgres:password@localhost/olimp')
11+
engine = create_engine(os.environ.get('PG_DATABASE_URL'))
1112
Session = mptt_sessionmaker(sessionmaker(bind=engine))
1213
session = Session()
1314

@@ -45,15 +46,23 @@ def save2db(child, prev_db_folder=None):
4546
bookmarks = bookmarks_parser.parse("/home/andriy/PycharmProjects/bookmarks2db/chrome_bookmarks.html")
4647
save2db(bookmarks)
4748

48-
# move folder with all nested bookmarks and folders
49-
def move(folder, dest_folder):
49+
# move folder with all nested bookmarks and folders to other folder and set position
50+
def move_folder(folder, dest_folder):
5051
f = session.query(Folder).filter(Folder.title == folder).one()
51-
print(f.id)
5252
dest = session.query(Folder).filter(Folder.title == dest_folder).one()
53-
print(dest.id)
54-
f.move_inside(dest.id)
53+
f.move_after(dest.id)
5554
session.commit()
56-
move('First level bookmark bar folder', 'folder on other')
55+
move_folder('folder on other', 'First level bookmark bar folder')
56+
57+
# move bookmark between folder and position
58+
def move_bookmark_before(bookmark_title, folder_title, before_bookmark_title):
59+
bookmark = session.query(Bookmark).filter(Bookmark.title == bookmark_title).one()
60+
folder = session.query(Folder).filter(Folder.title == folder_title).one()
61+
after_bookmark = session.query(Bookmark).filter(Bookmark.title == before_bookmark_title).one()
62+
folder.bookmarks.insert(after_bookmark.position, bookmark)
63+
session.commit()
64+
65+
move_bookmark_before('reddit: the front page of the internet', 'Second level bookmark bar folder', 'Google Перекладач')
5766

5867
# remove folder with all nested bookmarks and folders
5968
node = session.query(Folder).filter(Folder.title == 'First level bookmark bar folder').one()

SQL/sqlalchemy/mptt/model.py

+13-12
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1+
import os
2+
13
from sqlalchemy import Column, Integer, create_engine, orm, String, DateTime, func, ARRAY, ForeignKey
24
from sqlalchemy.ext.declarative import declarative_base
5+
from sqlalchemy.ext.orderinglist import ordering_list
36
from sqlalchemy.orm import sessionmaker, relationship
47
from sqlalchemy_mptt import mptt_sessionmaker
58

69
from sqlalchemy_mptt.mixins import BaseNestedSets
710

8-
engine = create_engine('postgresql://postgres:password@localhost/db')
11+
engine = create_engine(os.environ.get('PG_DATABASE_URL'))
912
connection = engine.connect()
1013
Base = declarative_base()
14+
Base.metadata.bind = engine
1115

1216

1317
class Folder(Base, BaseNestedSets):
@@ -17,7 +21,8 @@ class Folder(Base, BaseNestedSets):
1721
title = Column(String, nullable=False)
1822
add_date = Column(DateTime, default=func.now())
1923
last_modified = Column(DateTime, default=func.now())
20-
bookmarks = relationship("Bookmark", cascade="all")
24+
bookmarks = relationship("Bookmark", cascade="all", order_by="Bookmark.position",
25+
collection_class=ordering_list('position'))
2126

2227

2328
class Bookmark(Base):
@@ -30,21 +35,17 @@ class Bookmark(Base):
3035
icon_uri = Column(String)
3136
tags = Column(ARRAY(Integer))
3237
parent_id = Column(Integer, ForeignKey('folder_mptt.id'))
38+
position = Column(Integer)
3339

3440

3541
if __name__ == '__main__':
3642
Session = mptt_sessionmaker(sessionmaker(bind=engine))
3743
session = Session()
3844

3945
orm.configure_mappers()
40-
session.query(Bookmark).delete()
41-
session.query(Folder).delete()
42-
session.commit()
43-
44-
# Folder.__table__.drop()
45-
Base.metadata.create_all(connection)
46-
#
47-
# node = Folder(title='First level')
48-
# session.add(node)
49-
# session.commit()
46+
47+
# Base.metadata.create_all(connection)
48+
Bookmark.__table__.drop()
49+
Folder.__table__.drop()
50+
# Base.metadata.create_all(connection)
5051

SQL/sqlalchemy/postgresql_ltree/CRUD.py

+25-8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import os
12
from datetime import datetime
23

34
import bookmarks_parser
@@ -8,7 +9,7 @@
89
from SQL.sqlalchemy.postgresql_ltree.model import Folder, Bookmark, Base
910
from slugify import slugify
1011

11-
engine = create_engine('postgresql://postgres:password@localhost/db')
12+
engine = create_engine(os.environ.get('PG_DATABASE_URL'))
1213
Base.metadata.bind = engine
1314

1415
Session = sessionmaker(bind=engine)
@@ -30,6 +31,9 @@ def save2db(child, prev_dict_folder=None, prev_db_folder=None):
3031
else:
3132
bookmark['path'] = slugify(bookmark['title'], separator="_")
3233
folder = Folder(title=title, add_date=add_date, last_modified=last_modified, path=Ltree(bookmark['path']))
34+
if prev_db_folder:
35+
prev_db_folder.folders.append(folder)
36+
3337
session.add(folder)
3438
session.commit()
3539
if bookmark['children']:
@@ -49,19 +53,32 @@ def save2db(child, prev_dict_folder=None, prev_db_folder=None):
4953
bookmarks = bookmarks_parser.parse("/home/andriy/PycharmProjects/bookmarks2db/chrome_bookmarks.html")
5054
save2db(bookmarks)
5155

52-
# move folder with all nested bookmarks and folders
53-
first_level_folder = session.query(Folder).filter(Folder.title == 'First level bookmark bar folder').one()
54-
index = first_level_folder.path.index(first_level_folder.path[-1])
55-
move_to_folder_on_other = session.query(Folder).filter(Folder.title == 'folder on other').one()
56+
# move folder with all nested bookmarks and folders to other folder aster certain position
57+
folder_on_other = session.query(Folder).filter(Folder.title == 'folder on other').one()
58+
index = folder_on_other.path.index(folder_on_other.path[-1])
59+
move_to_first_level_folder = session.query(Folder).filter(Folder.title == 'First level bookmark bar folder').one()
5660

57-
first_level_folders = session.query(Folder).filter(Folder.path.descendant_of(first_level_folder.path)).all()
61+
first_level_folders = session.query(Folder).filter(Folder.path.descendant_of(folder_on_other.path)).all()
5862
for folder in first_level_folders:
5963
path = folder.path[index:]
60-
folder.path = move_to_folder_on_other.path + path
64+
folder.path = move_to_first_level_folder.path + path
6165
session.add(folder)
66+
67+
first_level_parent = session.query(Folder).filter(Folder.id == move_to_first_level_folder.parent_id).one()
68+
first_level_parent.folders.insert(move_to_first_level_folder.position + 1, folder_on_other)
6269
session.commit()
6370

64-
# # remove folder with all nested bookmarks and folders
71+
# move bookmark to other folder and certain position
72+
def move_bookmark_before(bookmark_title, folder_title, after_bookmark_title):
73+
bookmark = session.query(Bookmark).filter(Bookmark.title == bookmark_title).one()
74+
folder = session.query(Folder).filter(Folder.title == folder_title).one()
75+
after_bookmark = session.query(Bookmark).filter(Bookmark.title == after_bookmark_title).one()
76+
folder.bookmarks.insert(after_bookmark.position, bookmark)
77+
session.commit()
78+
79+
move_bookmark_before('reddit: the front page of the internet', 'Second level bookmark bar folder', 'Google Перекладач')
80+
81+
# remove folder with all nested bookmarks and folders
6582
first_level_folder = session.query(Folder).filter(Folder.title == 'First level bookmark bar folder').one()
6683
first_level_folders = session.query(Folder).filter(Folder.path.descendant_of(first_level_folder.path)).all()
6784
for folder in first_level_folders:

SQL/sqlalchemy/postgresql_ltree/model.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
import os
2+
13
import sqlalchemy as sa
24
from sqlalchemy import create_engine
35
from sqlalchemy.ext.declarative import declarative_base
6+
from sqlalchemy.ext.orderinglist import ordering_list
47
from sqlalchemy.orm import sessionmaker, relationship
58
from sqlalchemy_utils import LtreeType, URLType
69

7-
engine = create_engine('postgresql://postgres:password@localhost/db')
10+
engine = create_engine(os.environ.get('PG_DATABASE_URL'))
811
connection = engine.connect()
912
Base = declarative_base()
1013

@@ -16,7 +19,12 @@ class Folder(Base):
1619
add_date = sa.Column(sa.DateTime, default=sa.func.now())
1720
last_modified = sa.Column(sa.DateTime, default=sa.func.now())
1821
path = sa.Column(LtreeType)
19-
bookmarks = relationship("Bookmark", cascade="all")
22+
position = sa.Column(sa.Integer)
23+
parent_id = sa.Column(sa.Integer, sa.ForeignKey('folder.id'))
24+
folders = relationship("Folder", cascade="all", order_by="Folder.position",
25+
collection_class=ordering_list('position'))
26+
bookmarks = relationship("Bookmark", cascade="all", order_by="Bookmark.position",
27+
collection_class=ordering_list('position'))
2028

2129

2230
class Bookmark(Base):
@@ -29,6 +37,7 @@ class Bookmark(Base):
2937
icon_uri = sa.Column(URLType)
3038
tags = sa.Column(sa.ARRAY(sa.Integer))
3139
parent_id = sa.Column(sa.Integer, sa.ForeignKey('folder.id'))
40+
position = sa.Column(sa.Integer)
3241

3342

3443
if __name__ == '__main__':

0 commit comments

Comments
 (0)