user_dep.py
6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
import colander
import logging
from deform import widget
from pyramid.view import view_config
from . import BaseView, button_import
from ...models import User, DepartemenUser, Departemen, DBSession
from .departemen import get_departemen_list
from .user import user_list
from pyramid.i18n import TranslationStringFactory
_ = TranslationStringFactory('myapp')
log = logging.getLogger(__name__)
@colander.deferred
def departemen_widget(node, kw):
values = kw.get('departemen_list', [])
return widget.CheckboxChoiceWidget(values=values, multiple=True, placeholder='Pilih Departemen')
class ListSchema(colander.Schema):
id = colander.SchemaNode(
colander.Integer(),
title="Action"
)
user_name = colander.SchemaNode(
colander.String(),
field=User.user_name,
title="User"
)
departemen_name = colander.SchemaNode(
colander.String(),
field=Departemen.nama,
title="Departemen"
)
@colander.deferred
def departemen_checkbox_widget(node, kw):
values = kw.get('departemen_list', [])
return widget.CheckboxChoiceWidget(values=values, multiple=True)
class AddSchema(colander.Schema):
user_id = colander.SchemaNode(
colander.Integer(),
widget=widget.SelectWidget(values=User.get_list()),
oid="user_id",
title="User",
)
departemen_id = colander.SchemaNode(
colander.Set(),
widget=departemen_checkbox_widget,
oid="departemen_id",
title="Departemen",
)
class EditSchema(AddSchema):
id = colander.SchemaNode(
colander.String(),
missing=colander.drop,
widget=widget.HiddenWidget(readonly=True)
)
class Views(BaseView):
def __init__(self, request):
super().__init__(request)
self.request = request
self.list_schema = ListSchema
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.list_route = 'user-departemen'
self.table = DepartemenUser
self.list_buttons = self.list_buttons + (button_import,)
def list_join(self, query, **kwargs):
return query.outerjoin(Departemen, Departemen.id == self.table.departemen_id) \
.outerjoin(User, User.id == self.table.user_id)
@view_config(route_name='user-departemen', renderer='templates/table.pt',
permission='user-view')
def view_list(self, **kwargs):
return super().view_list(**kwargs)
@view_config(route_name='user-departemen-act', renderer='json',
permission='user-view')
def view_act(self):
return super().view_act()
def get_bindings(self, row=None):
bindings = {
"departemen_list": get_departemen_list(),
"user_list": user_list()
}
if row and hasattr(row, 'user_id'):
existing_depts = self.get_existing_departemen(row.user_id)
bindings["default_values"] = {
"user_id": row.user_id,
"departemen_id": list(existing_depts)
}
return bindings
@view_config(route_name='user-departemen-add', renderer='templates/form.pt',
permission='user-edit')
def view_add(self):
return super().view_add()
@view_config(route_name='user-departemen-view', renderer='templates/form.pt',
permission='user-view')
def view_view(self):
return super().view_view()
@view_config(route_name='user-departemen-delete', renderer='templates/form.pt',
permission='user-edit')
def view_delete(self):
return super().view_delete()
@view_config(route_name='user-departemen-edit', renderer='templates/form.pt',
permission='user-edit')
def view_edit(self):
return super().view_edit()
@view_config(route_name='user-departemen-upload',
renderer='templates/form.pt', permission='user-upload')
def view_upload(self):
self.upload_keys = ["user_id"]
return super(Views, self).view_upload(exts=(".csv", ".tsv"))
def save_request(self, values, row=None):
user_id = values.get("user_id")
if not user_id:
return None
if "departemen_id" in values:
selected_departemen = set(
str(departemen_id) for departemen_id in values["departemen_id"]
if departemen_id is not None and str(departemen_id) != "None"
)
# Batasi ke maksimal dua pilihan
selected_list = sorted(selected_departemen)[:2] # Ambil dua yang pertama
dept1 = int(selected_list[0]) if selected_list else None
dept2 = int(selected_list[1]) if len(selected_list) > 1 else None
existing_row = DBSession.query(DepartemenUser).filter_by(user_id=user_id).first()
if selected_list:
if existing_row:
# Update jika sudah ada
existing_row.departemen_id = dept1
existing_row.sub_departemen = dept2
else:
# Tambah baru jika belum ada
new_row = DepartemenUser(
user_id=user_id,
departemen_id=dept1,
sub_departemen=dept2
)
DBSession.add(new_row)
else:
# Jika tidak ada pilihan, hapus row yang ada
if existing_row:
DBSession.delete(existing_row)
DBSession.flush()
return row
def get_existing_departemen(self, user_id):
row = DBSession.query(DepartemenUser).filter_by(user_id=user_id).first()
result = set()
if row:
if row.departemen_id:
result.add(str(row.departemen_id))
if row.sub_departemen:
result.add(str(row.sub_departemen))
return result
def get_values(self, row, istime=False):
d = super(Views, self).get_values(row, istime)
d["departemen_id"] = self.get_existing_departemen(row.user_id)
return d