Browse Source

Add posts from wiki

master
sipp11 10 years ago
parent
commit
a62bbd6ece
  1. 8
      _posts/2013-10-18-milestone.md
  2. 182
      _posts/2013-10-29-reportlab-101.md
  3. 634
      _posts/2013-11-12-psis-record.md
  4. 209
      _posts/2013-11-13-app-setup.md
  5. 174
      _posts/2013-12-19-pdf-styling.md
  6. 19
      _posts/2013-12-23-auto-people-id.md
  7. 24
      _posts/2014-11-04-errorcode.md
  8. 70
      _posts/2014-11-10-admin-command.md
  9. 113
      _posts/2014-11-10-admin-todo-list.md
  10. 27
      handbook.md
  11. 2
      index.html

8
_posts/2013-10-18-milestone.md

File diff suppressed because one or more lines are too long

182
_posts/2013-10-29-reportlab-101.md

@ -0,0 +1,182 @@
---
layout: post
type: handbook
title: "ReportLab 101"
date: 2013-10-29
tags: coding pdf reportlab
---
## Style
เราจะใชเพยงแค font TH Sarabun New ครบ โดยจะมใหเลอกแค 2 แบบ:-
* TH Sarabun New
* TH Sarabun New Bold
วนแตละสวนนน สามารถจดการ style โดยการออกแบบ Style ของแตละสวนกอน เชน ใหวกระดาษเปนอยางนง, เนอหาอยางนง, ในตารางอกแบบนง, คำอธบายใตตารางอกแบบนง เปนตน พยายามจดการใหนไมองมแบบมาก เพราะ (1)งายตอการอาน code (2)งายตอตอการแกไข (3)ไมมเฟอย
เทาทายทดคอ ใช `ParagraphStyle` โดยเราสามารถจดการไดโดย `import ParagraphStyle`านบนของ file กอน
from core.views.pdfs import Paragraph, ParagraphStyle
จากนนเรากจะสามารถกำหนด style ของตวเองได
style_x1 = ParagraphStyle(name="style_name",
fontName='TH Sarabun New',
fontSize=16,
alignment=TA_CENTER,
leading=16,
spaceAfter=8,)
`name="xxx"` เปนสงทจำเปนสำหร`ParagraphStyle` นอกนนกกำหนดตามตองการ ตรง `TA_CENTER` แปลวา ใหนอยตรงกลาง ซงกงม `TA_LEFT`, `TA_RIGHT`, `TA_JUSTIFY` ตามชอ โดยถาตองการใชาพวกนอง import ดวย เช
from reportlab.lib.enums import TA_CENTER, TA_LEFT
านมาคอ การตงวา style เราจะมอะไรบางตอไปกจะเปนการใช style หลกๆแลวเราจะใช Python List (กอารมณ array นนแหละ) ในการเกบขอมลแตละชดๆไป จะอารมณประมาณว
lines = [] # เรม declare list กอน
lines.append(Paragraph("บรรทดแรก", style_x1)) # อนนเหมอนเพม element ใน list
lines.append(Paragraph("บรรทดทสอง", style_x1)) # อนนเหมอนเพม element ใน list ตอไป
เรากจะไดประมาณว
บรรทดแรก
บรรทดทสอง
นจะตรงกลางนะ แตมในนลำบาก กเลยทำเปนเปนแควอยาง
### Color
การกำหนดสจากทใช `colors.lightgrey` อะไรไปกงสามารถกำหนดสเองไดโดย
from reportlab.lib.colors import Color
red50transparent = Color(100, 0, 0, alpha=0.5)
โดย `Color(สแดง, สเขยว, สา, alpha=1)` โดยแตละสาตงแต 0-255 และ alpha กาตงแต 0-1 (1 คอ ทบ, 0 คอ ใสทะลปรโปรง) จากนนกเอา `red50transparent` ไปแทนท `colors.lightgrey` ไดเลย
### ขอสงเกต
1. การขนบรรทดใหมาเปน Paragraph เดยวกนมนจะตดขนบรรทดใหมใหเอง โดยใชองวางเปนตวตด มนใชไดบภาษาองกฤษ แตไมใชภาษาไทย ดงนนเราตองตดคำเองครบ ถาคดวาตวอกษรมนมจำนวนไมแนนอน เผอไวเลยครบ ดกวากลายเปนฉกคำประหลาดๆ ใหานหลงวางไวเยอะหนอยยงดกวามาก
1. การขนบรรทดใหม สามารถใช html tag <br/> เปนตวขนบรรทดใหมไดเลย
1. แตละ Paragraph จะขนบรรทดใหมเสมอ คามนจะขนกบ spaceBefore กบ spaceAfter
## Table
ตารางเปนอกสวนทความซบซอนพอสมควรในกรณ cell รวมกน แตาตามปกตายๆ ไมอะไร มาดวอยางงายๆ แลวคอยไลอธบายบางทอาจจะเขาใจงายกว
data = [
['top\nLeft', '10', '20', '30'],
['01', '11', '21'],
['02', '12', '22', '32'],
['03', '13', '23', '33'],
['04', '14', '24', '34'],
]
t = Table(data, style=[
('FONTNAME', (0,0), (-1,-1), 'TH Sarabun New Bold'),
('GRID', (0,0), (-1,-1), 0.5 , colors.grey),
('BACKGROUND',(0,0),(1,1),colors.palegreen),
('SPAN',(0,0),(1,1)),
('BACKGROUND',(-2,-2),(-1,-1), colors.red),
('SPAN',(-2,-2),(-1,-1)),
])
lines.append(t)
data นนจะเปนตวเกบขอมลไวแสดงในตารางโดยจะเปน list 2 หรอ 3 ม เรยกไมกเหมอนกน แตนจะซอนกนอยางนน โดยระดบแรกจะเปนตวขอมลแสดงของ row และระดบท 2 กอจะเปนตวขอมลในระดบ column ของแตละ row โดยขอมลนนจะใช `Table` เปนตวแปลงใหเปนตาราง (ซงกอง import อกนนแหละ)
from core.views.pdfs import Table
หลงจากนนกองไปตอใน lines เหมอนกบททำกบ Paragraph ไมดครบ ความสบสนของตารางมนจะอยตรงท style มากกวา มาดผลโดยประมาณกนกอนวา มนจะได ตารางใน pdf ยงไงกนแน
<table class="wikitable"><tbody><tr><td style="background-color: #33dd33;" colspan="2" rowspan="2">top<p>Left</p></td><td>20</td><td>30</td></tr><tr><td>12</td><td></td></tr><tr><td>02</td><td>12</td><td>22</td><td>32</td></tr><tr><td>03</td><td>13</td><td style="background-color: #f66;" colspan="2" rowspan="2">23</td></tr><tr><td>04</td><td>14</td></tr></tbody></table>
ตารางจะเรมทมบนซาย -- เรมดวย column 0 และ row 0 --> (0, 0) ตามทเหนกวๆนะครบ ขเกยจครบ อยางทเหนชดๆ คอ จะม cell merge กนอย 2 ท
1. มมซายบน ตำแหน`(col, row) (0, 0)``(1, 1)`
1. มมขวาลาง ตำแหน`(col, row) (2, 3)``(3, 4)` หรอมองอกมม (ขวาลาง) ค`(-2,-2),(-1,-1)`
จรงๆ กจะเหนชดเจนกวา style มนเนย ตรงท cell merge กน ถกกำหนดดวย
('BACKGROUND',(0,0),(1,1),colors.palegreen),
('SPAN',(0,0),(1,1)),
`BACKGROUND`ไมไดเกยวอะไรกบเคา เพยงแคบอกสครบ SPAN เปนตวบอกวา เราจะรวม cell ไหนถงตรงไหนกนแน โดยขอมลจะเปนขอมลของ cell แรกเสมอคร
### จดตำแหน
าตองการจะจดตำแหนงอกษรของแตละ cell กเพมใน style ของ Table ได
('ALIGN',(0,0),(0,0),'CENTER'),
('VALIGN',(0,0),(0,0),'MIDDLE'),
* `ALIGN`อ จดตำแหนงแนวนอน มาเป`LEFT`, `RIGHT`, `CENTER` -- คา default เป`LEFT`
* `VALIGN`อ จดตำแหนงแนวนอน มาเป`TOP`, `MIDDLE`, `BOTTOM` -- คา default เป`BOTTOM`
ในกรณองการจดการตำแหนงของ cell ทการรวม cell กำหนดตำแหนงแค cell ทอมล (มมขวาบน) กพอ
### ขอสงเกต
1. `SPAN` สามารถกำหนด ตำแหนงคาตดลบได `('SPAN',(-2,-2),(-1,-1))` << โดยจะเปนการคดจากมมขวาลางมา ตรงขามกบคาบวกทดจากมมซายบน
1. `SPAN` จะไมสนใจขอมลทอยในตำแหนงอนเลย นอกจากตวมมบนขวาของทรวม -- ตวอนจะอารมณกทบไปเลย โดยสงเกตไดจากตวอยาง row ท 2 กลายเปนวา 01, 11 หายไปเลย โดยตำแหนง 21 กไมไดเปลยนไป
1. ถา list มไมครบในตาราง ตรงทขาดไปกจะเปนชองวาง
1. การขนบรรทดใหมในตารางใช escape key `\n` ไมใช `<br/>` เหมอนใน `Paragraph`
1. พวก `SPAN` ใน style ไมไดองเรยงลำดบอะไรครบ จดยงไงกไดนอานรเรอง แตควรจะทำใหนเปนจากบนลงลาง เปนระบบหนอยกเพราะแคเราจะกลบไปแกลำบากขนเยอะ ถามนไลไมไดายๆคร
เทานาจะพอได idea ไปลองแลวหล
## การแกใน .py
ใครใชรายงานไหน จรงๆ กาจะมอะไรอยใน file พอสมควรแลวครบ แตวนทองแกอ สวนของ
def prep_to_pdf(self, context):
lines = []
......
.....
...
..
return render_to_pdf(lines)
แควนจดๆๆ นแหละครบ ทองแกไข (ซงชอตวแปร lines กเปลยนไดตามชอบใจครบ ทใช lines เพราะจะไดสอดคลองกบตวอยางดานบน)
### การใชคำสงตางๆ
โดยมากแลวจะเปนการเปรยบเทยบคำสงตางๆ ของ templatetag ทเหนใน .html กบทองเขยนใน python (.py) ใน html นนจะมการเรยกใชงานตวแปรและ function ทางออกไปจากปกต
{{date}}
`{{ }}` ไวสำหรบแสดงผลตวแปรนนเปน string
{{date|month_full_th}}
| เปนการบงบอกวา มการใช function กบตวแปร date โดยเราจะสามารถดไดา function นออะไรไดจากการ import function ขางบน ซงใน `templatetag` จะใชคำส`{ % load yyyyy % }`
การใชงาน function พวกนใน python code นนจะสามารถทำไดโดย
from core.templatetags.extratags import intcomma2, intword_th, month_full_th
thb = 1423.223
print u'ราคา %s' % intcomma2(thb)
# จะไดผลลพธเป
ราคา 1,423.22
### คำสงอางอ
templatetags ทใชใน .html กแตกตางกนออกไปแตหลกๆกจะมอย 2 ทวยกนค
* `report_tags` -- สวนใหญจะเปนการแปลงคาแสดงผลทเกยวกบโรงเรยนทงหมด เชน แสดงรอบ แสดงชนเปนต
from school.templatetags.report_tags import *
* `extra_tags` -- เปนการแปลงคาเพอแสดงผลทวๆไป เชน ใน , ในหลกพน การพมวนทเปนภาษาไทย หรอพมจำนวนเงนเปนภาษาไทย
from core.templatetags.extra_tags import *
รายละเอยดของคำสงมงน
<table class="wikitable"><tbody><tr><th> file</th><th> function</th><th> description</th></tr><tr><td style="background-color: #ffffcc;" rowspan="6">report_tags</td><td style="background-color: #ffffcc;" colspan="2"> school.templatetags.report_tags</td></tr><tr><td> shift_display</td><td> แปลงค<ul><li> 0 -&gt; รอบเชา และ</li><li> 1 -&gt; รอบบาย</li></ul></td></tr><tr><td> coarse_grade_display</td><td> แสดงชนปแบบคราวๆ โดยจะใชาชนปแบบใดกได ผลเปนแบบหยาบเสมอ โดยจะแสดงเป<ul><li> เตรยมอนบาล</li><li> อนบาล</li><li> ประถมศกษา</li><li>ธยมศกษาตอนต</li><li>ธยมศกษาตอนปลาย</li><li> ประกาศนยบตรวชาช</li><li> ปวส.</li><li> ปวท.</li></ul></td></tr><tr><td> fine_grade_display</td><td> แสดงชนปแบบเจาะจงชนป<p>โดยจะแสดงเป</p><ul><li> เตรยมอนบาล</li><li> อ.1, อ.2, อ.3</li><li> ป.1, ป.2, ป.3, ป.4, ป.5, ป.6, </li><li> ม.1, ม.2, ม.3, ม.4, ม.5, ม.6, </li><li> ปวช.1-3</li><li> ปวส.1-3</li><li> ปวท.1-2</li></ul></td></tr><tr><td> course_display</td><td> แสดงหลกสตรของสายวชาชพของแตละหอง</td></tr><tr><td> education_level_display</td><td> แสดงวไดบการบรรจของบคลากร เชน ป.เอก (คร) ป.เอก</td></tr><tr><td style="background-color: #ffffcc;" rowspan="9"> extra_tags</td><td style="background-color: #ffffcc;" colspan="2"> core.templatetags.extra_tags</td></tr><tr><td> intcomma2</td><td> เตม , ใหบหลกพน และถาคาเปนทศนยมกจะตดเหลอแค 2 หลกใหตโนม</td></tr><tr><td> intword_th</td><td> แสดงจำนวนเงนเปนภาษาไทย</td></tr><tr><td> date_abbv_th</td><td> 11 พ.ย. 2556</td></tr><tr><td> date_full_th</td><td> 5 ธนวาคม 2556</td></tr><tr><td> month_abbv_th</td><td> ม.ค. 2556</td></tr><tr><td> month_full_th</td><td>มภาพนธ 2556</td></tr><tr><td> year_th</td><td> 2556</td></tr><tr><td> system_status_display</td><td></td></tr></tbody></table>

634
_posts/2013-11-12-psis-record.md

@ -0,0 +1,634 @@
---
layout: post
type: handbook
title: "psisRecord"
date: 2013-11-12
tags: database
---
Now all data in the past will be in another database. MongoDB it is.
### เปาหมาย
* ขอมลทเกบไวจะตองมมากพอทจะสรางรายงานใหมไดนท โดยไมโอกาสทจะมอมลหายไปได เชน ขอมลไรสาระอยางรายละเอยดเพมเตมอยางตวอยางคำอธบายตวยอคาคงทจะไมจำเปนตองใสเพราะซำซอนและสามารถเรยกไดแนนอน ทกเวลาจากฐานขอมลหล
* ขอมลจะตองเขาถงงายเพอสรางรายงานเปรยบเทยบใหบสำนกงานตางๆ ได
### buffer
เปนสวนทการคำนวณขอมลเพอเกบไวสำหรบรายงานตอๆไป หลกๆ คอ ms* report เทานนทใชสำหรบตอนน
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"), # report_date
"report": "*",
...
}
#### report
1. ms_est_receipt
2. ms_actual
3. ms_actual_receipt
4. ms_actual_diff_receipt
5. ms_matrix
าหนงสอเรยน ใบเสรจ ประมาณการ
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"), # report_date
"report": "ms_est_receipt",
"data": {
...
}
}
าหนงสอเรยน นกเรยนทอยจรง Jun 10
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"), # report_date
"report": "ms_actual",
"data": {
...
}
}
าหนงสอเรยน ใบสำคญรบขอเบกเพมเตม Jun 10
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"), # report_date
"report": "ms_actual_diff_receipt",
"data": {
...
}
}
าหนงสอเรยน นกเรยนทอยจรง Nov 10
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"), # report_date
"report": "ms_actual",
"data": {
...
}
}
าหนงสอเรยน ใบสำคญรบขอเบก Nov 10
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"), # report_date
"report": "ms_actual_receipt",
"data": {
...
}
}
## report
หลกๆ ขอมลตรงนเอาไวออกรายงานโดยทไมจำเปนตองประมวลผลจากขอมลใหม (หรอขอมลดบไมแลว) รายงานกประมาณ
1. sub1
1. sub2
1. sub3
1. sub4
1. sub5
1. sub6
1. salary
1. payment
1. sub4_fake
1. ms_est
1. ms_est_receipt
1. ms_actual_jun10
1. ms_actual_jun10_receipt
1. ms_matrix
1. ms_actual_nov10
1. ms_actual_nov10_receipt
### รายงาน อน.1
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"), # report_date
"report": "sub1",
"is_charity": true/false,
"data": {
'disabled': {
'sum': 0,
'shift': [
{}, # day shift
{}, # night shift
]
},
'normal': {
'sum': 0,
'shift': [ ## list consisting of 0, 1 indicating shift
{ # shift start
u'1-0': { # grade and course
'text': {'grade': '1', 'course': u'0'},
'number':
{
'boarding': 0,
'normal': 296,
'tuition': 1937.0,
'disabled': 0,
'rate': {'normal': 7793.0, 'charity': 0}
}
}
},
{
... # another shift if applied
}
]
},
"total": {
'normal': {
'0': {'normal':0, 'charity':0, 'sum':0},
'1': {'normal':0, 'charity':0, 'sum':0},
'all':{'normal':0, 'charity':0, 'sum':0},
},
'disabled': {
'0': {'disabled':0, 'boarding':0, 'sum':0},
'1': {'disabled':0, 'boarding':0, 'sum':0},
'all': {'disabled':0, 'boarding':0, 'sum':0},
},
}
}
### รายงาน อน.2
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"), # report_date
"report": "sub2",
"is_charity": true/false,
"data": {
'0': { # shift !
'0': { # coarse grade
'sum': {
'abs_total': 0,
'charity': 0, 'normal': 0, 'boarding': 0, 'disabled': 0,
'teachers': 0, 'salary': 0,
},
'crs': [
{ # room thing and teacher data
"room": xx, "all_students": 0, "boarding": 0, "disabled": 0, "eligible": 0,
"full_name": xxx, "education": yyy, "employment_date": yyyy-mm-dd,
"employment_document_number": xxx, "salary": 0
},
{},
{},
],
'extra': [
{ # only teacher data
"full_name": xxx, "education": yyy, "employment_date": yyyy-mm-dd,
"employment_document_number": xxx, "salary": 0
},
{},
{},
]
},
'1': { # coarse grade
},
},
'1': { # shift if applied
},
},
"total": {
'0': {'abs_total': 0, 'normal': 0, 'boarding': 0, 'disabled': 0, 'teachers': 0, 'salary': 0,},
'1': {'abs_total': 0, 'normal': 0, 'boarding': 0, 'disabled': 0, 'teachers': 0, 'salary': 0,},
'all': {'abs_total': 0, 'normal': 0, 'boarding': 0, 'disabled': 0, 'teachers': 0, 'salary': 0,}
}
}
### รายงาน อน.3
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"), # report_date
"report": "sub3",
"is_charity": true/false,
"data": {
}
}
### รายงาน อน.4
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"), # report_date
"report": "sub4",
"is_charity": true/false,
"data": {
}
}
### รายงาน อน.5
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"), # report_date
"report": "sub5",
"is_charity": true/false,
"data": {
}
}
### รายงาน อน.6
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"), # report_date
"report": "sub6",
"is_charity": true/false,
"data": {
}
}
### บญชการจายเงนเดอนคร
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"), # report_date
"report": "salary",
"is_charity": true/false,
"data": {
}
}
### หลกฐานการจายเงนเดอนคร
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"), # report_date
"report": "payment",
"is_charity": true/false,
"data": {
}
}
### ขอมลเกบเผอสราง อน.4 ยอนหล
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"), # report_date
"report": "sub4_fake",
"data": {
# student detail count enough to feed ReportSub4Mixin.get_processed_data()
}
}
## stat
### original data
This is what data with all grades; no dob cut; no student_status considered; no issue considered; but we only sum student in class. Student without class is out of luck ever. This is a pure query.
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"),
"type": "original",
"data": {
}
}
### raw data without any cut
Raw data which met basic requirements, no further cut. (shift isn't considered) This should meet few requirements:
* eligible grade
* verified & completed classroom
* date of birth
* student_status
* resolved issue students
From get_subsidized_students_queryset() w/o any cut.
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"),
"type": "raw",
"data": {
}
}
นร. ประเภทสามญศกษา ททธบเงนอดหนนรายบคคล
Data from get_subsidized_students_in_fine_grade()
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"),
"type": "educational",
"data": {
}
}
นร. ประเภทอาชวศกษา ททธบเงนอดหนนรายบคคล
Data from get_subsidized_students_in_fine_grade()
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"),
"type": "technical",
"data": {
}
}
นร. พการในโรงเรยนเอกชน ประเภทสามญศกษา
Filter verified disabled people from get_subsidized_students_queryset().
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"),
"type": "disabled_educational",
"data": {
}
}
นร. พการในโรงเรยนเอกชน ประเภทอาชวศกษา
Filter verified disabled people from get_subsidized_students_queryset().
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"),
"type": "disabled_technical",
"data": {
}
}
นร. โรงเรยนการกศล และโรงเรยนสอนศาสนาอสลามควบคบวชาสามญทลน/มสยดเปนผบใบอนญาต
Data from evaluate_errors() which (school).is_charity() has to return True
{
"_id": xx,
"school": "<school_id>",
"date": ISODate("xxx"),
"type": "charity",
"data": {
}
}
## history
เปนการเกบขอมลนกเรยนเขา-ออกทงหมด จาก `archive_students_transfer`
{
"_id": xx,
"people_id": "<people_id>",
"date": ISODate("xxx"),
"transfer": "in/out",
"school": "<school_id>",
... # depending on whether it's transfer IN/OUT
}
data is pretty much the same way sub5/sub6 is.
## searchArchive
* school [yearly data]
* teacher [monthly data in/out only]
* student [every in/out]
* report [not implemented -- using report]
### school
{
"_id": xx,
"archive_type": "school",
"school": "<school_id>",
"basic": {
"thai_name": "<thai_name>",
"eng_name": "<eng_name>",
"serv_area_code": "<serv_area_code>",
},
"board": {
"licensee": {"people_id": "", "full_name": "",},
"manager": {"people_id": "", "full_name": "",},
"principle": {"people_id": "", "full_name": "",},
},
"bank": {
"account_number": "",
"account_name": "",
"bank": "",
"bank_branch": "",
},
"license": [
{
"license_number": "",
"license_date": "",
"license_effective_date": "",
"age": [min, max],
"shift": {
"0": {"capacity": 0, "room": 0, "time": ["0", "0"], "grade": ["0", "0"]},
"1": {"capacity": 0, "room": 0, "time": ["0", "0"], "grade": ["0", "0"]},
}
},
## more items
{}, {}, ...
]
}
### teacher
{
"_id": xx,
"archive_type": "teacher",
"school": "<school_id>",
"people_id": "",
"full_name": "",
"transfer_type": "<in/out>",
"date": ISODate("xxx"),
"editor": "<user_id>"
}
### student
{
"_id": xx,
"archive_type": "student",
"school": "<school_id>",
"people_id": "",
"full_name": "",
"transfer_type": "<in/out>",
"xfer_status": "<DC/RM/QT/GD/RL/DN/CF/IW/II/IO>",
"student_id": "",
"date": ISODate("xxx"),
"editor": "<user_id>"
}
### confirmation
อมลในสวนยนยนขอมลถกตองในสวนตางๆ
วนยนยนของโรงเรยน
นยนความถกตองประจำป (เฉพาะเดอน 6)
นยนความถกตองประจำเดอน
วนยนยนคณภาพของขอมลของสำนกงาน
นยนการยนเอกสาร
นยนความถกตองของขอม
วนยนยนของโรงเรยน - ยนยนความถกตองประจำป (เฉพาะเดอน 6)
{
"_id": xx,
"user_id": 000,
"username": "<username> or <email>",
"date": ISODate("xxx"),
"school": "<school_id>",
"what": "confirmation",
"type": "monthly", # only student for now.
}
วนยนยนของโรงเรยน - ยนยนความถกตองประจำเดอน
{
"_id": xx,
"user_id": 000,
"username": "<username> or <email>",
"date": ISODate("xxx"),
"school": "<school_id>",
"what": "confirmation",
"type": "yearly", # only student for now.
}
วนยนยนคณภาพของขอมลของสำนกงาน - ยนยนการยนเอกสาร
{
"_id": xx,
"user_id": 000,
"username": "<username> or <email>",
"date": ISODate("xxx"),
"school": "<school_id>",
"office": "<office_id>",
"what": "dataQuality",
"type": "delivered",
}
วนยนยนคณภาพของขอมลของสำนกงาน - ยนยนความถกตองของขอม
{
"_id": xx,
"user_id": 000,
"username": "<username> or <email>",
"date": ISODate("xxx"),
"school": "<school_id>",
"office": "<office_id>",
"what": "dataQuality",
"type": "completeness",
}
### preferences
System-wide's key-value storage.
no. | name | value | description
--- | --- | --- | ---
1 | `subsidy_rate_header` | text |
2 | `ms_est_first_level_cut` | decimal 0-1 |
__System Preferences__ | via <br/> `core.get_system_pref()` `core.set_system_pref() `| |
--- | --- | --- | ---
3 | `enforce_disability_expiration_date` | boolean
4 | `enforce_people_id_validation` | boolean
5 | `backfill_reviews_in_progress` | boolean | no more running repetitive back-filling reviews ever
6 | `check_student_issue_in_progress` | boolean | no more running repetitive task
7 | `check_teacher_issue_in_progress` | boolean | no more running repetitive task
8 | `sub4sum_in_progress` | boolean | no more running repetitive task
9 | `sub4sum_office_in_progress` | boolean | no more running repetitive task
วเรองของ subsidy rate
{
"_id": xx,
"year": "2013",
"name": "subsidy_rate_header",
"value": "xxxxxxxxxxx",
"user": "<user_pk>",
"username": "<username>",
"date": "utc"
}
ตราตดของการสนบสนนตามการประมาณการของเรยนฟร 15 ป
{
"_id": xx,
"year": "2013",
"name": "ms_est_first_level_cut",
"value": "xxxxxxxxxxx", # 0-1 (or 0-100%) [default 0.8]
"user": "<user_pk>",
"username": "<username>",
"date": "utc"
}
การบงคบใชนหมดอายของนกเรยนพการ
{
"_id": xx,
"name": "enforce_disability_expiration_date",
"value": "true/false", # boolean
"user": "<user_pk>",
"date": "utc"
}
การบงคบการตรวจสอบเลขประจำตวประชาชนทงหมด
าเปด true -- จะทำใหเลขประจำตวประชาชนทดหลกและยงไมไดตรวจสอบไมไดบอดหน
าปด false -- เลขประจำตวทดหลกและยงไมไดตรวจสอบกจะไดบอดหน
{
"_id": xx,
"name": "enforce_people_id_validation",
"value": "true/false", # boolean
"user": "<user_pk>",
"date": "utc"
}
## userPreferences
าตางๆ ทเกยวกบ user โดยตรง
{
"_id": xx,
"key": "logout_3rd_party_all_together",
"value": "True/False",
"user": "<user.pk>"
}
จะเปนคาในกรณองการออกจากระบบของ Google/Yahoo ดวย (Facebook ยงไม sign out เองอตโนม) เหมาะกบเครองทไมใชของตวเองเพราะจะไดไม sign in พวกนางไวาออกจาก PSIS กออกจาก Google/Yahoo ใหวยทนท [ซงนนคอคา default]
## userData
{
"_id": xx,
"date": "utc",
"user": "<user.pk>",
"name": "",
"value": "",
}
ตอนนจะเกบเพยงแค task_id ซงจะถกลบหลงผานไป 2-3 วน เพราะยงไง celery result task กไมเกบหลงจากนนอย
name | value
--- | ---
task_id | <many many character>

209
_posts/2013-11-13-app-setup.md

@ -0,0 +1,209 @@
---
layout: post
type: handbook
title: "PSISv2 Setup"
date: 2014-11-13
tags: admin setup
---
## การตดตงระบบ PSIS v2
ระบบ __PSIS v2__นจะรองรบเครองแมายทสามารถใชงาน `Python` และฐานขอม`PostgreSQL` หร`MySQL` หร`Oracle` ได แตอยางไรกเครองแมายทแนะนำในการใชงานก__PSIS v2__นจะเปนระบบปฏการใดๆ กตามททำงานบน Linux kernel ไมาจะเปน Debian, Ubuntu, CentOS, RedHat, Arch ตามแตความถนดของผปฏการ ซงเอกสารนจะใชระบบปฏการ Ubuntu 12.04 เปนตวอยาง
ความตองการของระบบ __PSIS v2__
* Python 2.7.x หรอใหมกว
* PostgreSQL 9 หรอใหมกว
* nginx 1.0.0 หรอใหมกว
## ขนตอนการตดตงระบบ PSIS v2
หลงจากตดตงระบบปฏการ Ubuntu 12.04 เรยบรอยแลว จะตองมการตดตงโปรแกรมทจำเปนในการใชงานของระบบ PSIS v2 ดงน
ดตงความพรอมของระบบทองใชเพมเตมจากระบบปฏการ
# apt-get update
# apt-get install postgresql mongodb nginx python python-pip git mercurial nodejs npm mysql-client
# npm install -g bower
## ตดตงสวนของ PSIS v2
การตดตงสวนนจะไมหลกเกณฑแนนอนในการตดตง แตเอกสารนจะสงทเกยวของกบโปรแกรมทงหมดใน `/opt/` เพอความสะดวกในการอธบาย ซงจะสามารถเปลยนแปลงไดตามความเหมาะสม
# mkdir -p /opt/psis-v2/
# cd /opt/psis-v2
ทำการคดลอกไฟลมายงไดเรกทอร
# bzip2 -d psis-v2-app.bz2
จะไดไดเรกทอร `/opt/psis-v2/app/` เพมขนมาซงเปนสวนของโปรแกรมนน จากนนจะตองทำการสรางไดเรกทอรแยกเพอใหเปน root ของ `nginx` เพอความปลอดภยของไฟลโปรแกรมหล
# mkdir -p /opt/psis-v2/static/
# ln -s /opt/psis-v2/app/static /opt/psis-v2/static
สรางไดเรกทอรสำหรบเกบ log
# mkdir -p /opt/psis-v2/log
จากนนจะตองลง `virtualenv` และ `virtualenvwrapper` โดยใชคำส
# pip install virtualenv virtualenvwrapper
หลงจากลงโปรแกรมทจำเปนตอระบบ จะยงตองลง library ท PSIS v2 ใชงานดวย
# apt-get build-dep python-mysqldb
# apt-get install graphviz libgraphviz-dev pkg-config
และ
$ cd /opt/psis-v2/
$ pip install -r requirements.txt
$ bower install
าไม error อะไรกจะเปนการเสรจสนการตดตงเราสามารถทดสอบวาใชงานไดหรอไมวยคำส
$ ./manage.py runserver
เมอใชงานไดแลว กสามารถปดการทำสอบไดจาก ctrl+C
### ตดตงสวนของ nginx
หลงจากสวนนจะตองทำการปรบแตงคาของ nginx เพอใหเปน proxy server และ media server ของระบบ PSIS v2
# vim /etc/nginx/sites-available/psis
โดยมอมลดงน
server {
listen 80;
server_name psisapp.com psis.opec.go.th;
access_log /opt/psis-v2/log/nginx_access.log;
error_log /opt/psis-v2/log/nginx_error.log;
root /opt/psis-v2/static/;
location ~* \.html$ {
expires -1;
}
location ~* \.(css|js|gif|jpe?g|png)$ {
expires 168h;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}
location /media/ {
# if asset versioning is used
if ($query_string) {
expires max;
}
}
location /static/ {
# if asset versioning is used
if ($query_string) {
expires max;
}
}
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 15;
proxy_read_timeout 45;
proxy_pass http://localhost:8000/;
}
}
จากนนจะตองสราง symbolic link ไปย`/etc/nginx/sites-enabled/` เพอให `nginx` ไดทำงานตามทเราตองการ
# ln -s /etc/nginx/sites-available/psis /etc/nginx/sites-enabled/psis
จากนนเราสามารถตรวจสอบวาไฟลเราทำนนมความถกตองหรอไมจาก
# service nginx configtest
เมอตรวจสอบแลวไมพบขอผดพลาดใดๆ จะขนว`Testing nginx configuration: nginx.` และจากนนกสามารถทดสอบไดจากคำส
# service nginx reload
### ตดตงสวนฐานขอม
ระบบ PSIS v2 นนจะใชฐานขอมล 2 ชนดดวยกนค
PostgreSQL ซงจะเปนฐานขอมลหลกสำหรบขอมลปจจนทงหมด
MongoDB ใชสำหรบเกบขอมลทไดประมวลผลแล
__PostgreSQL__
หลงจากตดตงไปแลวในสวนตดตงเพอความพรอมของระบบปฏการ การเปดใชงานกจะใชคำสงงายๆ ค
# service postgresql start
__MongoDB__
หลงจากตดตงไปแลวในสวนตดตงเพอความพรอมของระบบปฏการ การเปดใชงานกจะใชคำสงงายๆ ค
# service mongodb start
### ตดตงสวน upstart
ในสวนนจะเปนสวนททำใหเราสามารถเปดปดการทำงานของระบบ PSIS v2 ไดโดยคำสงงายๆ ดงน
# start psis_app
# stop psis_app
วนทเกยวของสำหร`upstart`นจะม 2 สวน คอ script สำหรบเรยก `gnuicorn` และ `upstart` script ของระบบปฏการในไดเรกทอร /etc/init/
วนแรก คอ สวนไฟลสครปสำหร`gunicorn`อ แอปพรเคชนสำหรบเรยกใชงาน `wsgi` โดยสราง bash script ดงน
# vim /opt/psis-v2/run_app.sh
โดยจะมรายละเอยดดงน
#!/bin/bash
set -e
LOGFILE=gunicorn_django.log
LOGDIR=$(dirname $LOGFILE)
NUM_WORKERS=3 #recommended formula here is 1 + 2 * NUM_CORES
VENV_DIR=/home/psisapp/.virtualenvs/psis
DJANGO_DIR=/opt/psis-v2/app
#we don't want to run this as root..
USER=psisapp
GROUP=psisapp
cd $DJANGO_DIR
source $VENV_DIR/bin/activate
test -d $LOGDIR || mkdir -p $LOGDIR
#exec gunicorn_django -w $NUM_WORKERS -b 0.0.0.0:8000
exec gunicorn core.wsgi:application -w $NUM_WORKERS -b 0.0.0.0:8000
--log-level=debug
--log-file=$LOGFILE 2>>$LOGFILE
--user=$USER --group=$GROUP
ในสวนของไฟล `upstart` จะตองสรางไฟล `psis_app.conf`
# vim /etc/init/psis_app.conf
โดยจะมรายละเอยดเปนดงน
description "PSIS v2 Application"
start on runlevel [2345]
stop on runlevel [06]
respawn
respawn limit 10 5
exec /opt/psis-v2/run_app.sh
างตนจะเปนวงหมดในการตดตงระบบ PSIS v2 เพอใหใชงานไดจากคำสง 2 คำสงงายๆ
$ sudo start psis_app
$ sudo stop psis_app
งในการใชงานจรงอาจจะใช `crontab` โดย root เพอทำใหระบบ PSIS v2 ทำงานไดตโนม เช
@reboot start psis_app

174
_posts/2013-12-19-pdf-styling.md

@ -0,0 +1,174 @@
---
layout: post
type: handbook
title: "PDF Styling"
date: 2013-12-19
tags: coding
---
จะม style คราวๆ ใหไดดการปรบแตงกนเอง (โดยเฉพาะตำแหนงการวาง ชดซาย กลาง ชดขวา) ใน core.views.pdfs ซงจรงๆแลวกจะแบงมาตรฐานเปน 2 สวน ค
* `Paragraph` -- กำหนดดวย `ParagraphStyle`
* `Table` -- กำหนด style ดวย `style_tab` (แตองใสเองทงหมด)
## Paragraph
ในสวนนจะเปนการกำหนด style คราวๆ เพอใหเปนแนวทางหลกในการใชงานทงหมด โดยมงหมดดงน
1. `style_base` - อนนเอาไวเปน parent style เฉยๆครบ เพราะมกำหนดแคปแบบตวอกษรเปน TH Sarabun
1. `style_h1` - ขนาด font 18 ตวหนา พรอมม space บนลางตามเหมาะสม
1. `style_h1c` - อนน`h1` แตง align เปน center คร
1. `style_h2` - ขนาด font 16 ตวหนา พรอมม space บนลางตามเหมาะสม
1. `style_h2c` - อนน`h2` แตง align เปน center คร
1. `style_h3` - ขนาด font 14 ตวหนา พรอมม space บนลางตามเหมาะสม
1. `style_h3c` - อนน`h2` แตง align เปน center คร
1. `style_normal` - ขนาด font 14 ไม space บนลาง ไมอหน
1. `style_normal_indent` - เหมอน `style_normal` แตอหนาของบรรทดแรกเขาไป 4 space คร
1. `style_footnote` - อนนสำหรบอธบายใตตารางครบ ตวเลกๆ 12 ไม space บนลาง ไมอหน
หรอจะเปน code กตามดานลางน
style_base = ParagraphStyle('normal', parent=style_base_sample,
fontName='TH Sarabun New')
style_h1 = ParagraphStyle('h1', parent=style_base,
fontName='TH Sarabun New Bold',
fontSize=18,
leading=21,
spaceBefore=7, spaceAfter=8,)
style_h1c = ParagraphStyle('h1c', parent=style_h1,
alignment=TA_CENTER,)
style_h2 = ParagraphStyle('h2', parent=style_base,
fontName='TH Sarabun New Bold',
fontSize=16,
leading=19,
spaceBefore=7, spaceAfter=8,)
style_h2c = ParagraphStyle('h1c', parent=style_h2,
alignment=TA_CENTER,)
style_h3 = ParagraphStyle('h2', parent=style_base,
fontName='TH Sarabun New Bold',
fontSize=14,
leading=17,
spaceBefore=7, spaceAfter=8,)
style_h3c = ParagraphStyle('h1c', parent=style_h3,
alignment=TA_CENTER,)
style_normal = ParagraphStyle('normal', parent=style_base,
fontSize=14,
leading=17,)
style_normal_indent = ParagraphStyle('normal', parent=style_normal,
firstLineIndent=16)
style_footnote = ParagraphStyle('footnote', parent=style_base,
fontSize=12,
leading=15,)
การใชงานจะสามารถ import ไดประมาณน
from core.views.pdfs import style_h1, style_h1c, style_normal
style พวกนอาจจะตอบคำถามไมไดหมด เชน ตวชดขอบซาย ขอบขวาจะทำอยางไร แนะนำใหทำตามนเพอให code ดสะอาดและจดการงายทดครบ เชน กรณเราตองการสวนทมวนทงจะมขนาดตามปกต (`style_normal`) แตนจะตองชดขอบขวา กจะสามารถทำไดโดยสราง style ของตวเองเป
style_normal_right = ParagraphStyle('nr', parent=style_normal, alignment=TA_RIGHT,)
ตอนนเรากจะได style ทดขวามาแลวโดยทเราไมไดกำหนดรปแบบตวอกษรเองเลย เพยงแคกำหนดวาใหนชดฝงไหนกพอตรง `alignment=TA_RIGHT`วนในเรองของยอหนานนจะม 2 เรองทองร
1. `firstLineIndent`นนจะคอ จะใหอหนาเทาไหรสำหรบบรรทดแรก แลวบรรทดอนกจะกลบมาชดซายสดเหมอนเด
1. `leftIndent` จะเปนการเลอนตำแหนงขอบซายทงยอหนา เหมอนอารมณใชบ list ทเปนขอๆ มนจะไมนไปซายสดขอบกระดาษ แตเปนการกำหนดวา เลอนขอบซายท`Paragraph`
1. หนวยของคาทใชสำหรบ 2 ตวนไมแนใจเหมอนกนวา คออะไรครบ แต 4 คอ เทากบ 1 ตวอกษร หรอถาตองการ 4 space กจะตองใช `firstLineIndent=16` เปนต
งสองอนนสามารถใชวมกนไดครบ ไมญหาอะไร
วนหนงทผมคดวา นาจะมญหาคอ ความสงระหวาง `Paragraph` หร`spaceBefore` และ `spaceAfter` ทาง style ขางตนจะมการกำหนดเพยงแควนของ `style_h1`, `style_h1c`, `style_h2`, `style_h2c`, `style_h3`, `style_h3c` แตในสวนของ `style_normal` จะไมไดกำหนดไวงนนจะสามารถเลอกไดเองวาจะทำ style ใหมเพอเพมในสวนน หรอวาจะใช Spacer กได
### Spacer
เปนแคววางเปลาไวกำหนดความส
from core.views.pdfs import Spacer
เวลาใช
lst.append(Spacer(1, 0.2*inch))
จะไดนทางระหวางตวบนกบตวลางมาแลว 1/5 ของ 1 น
## Table
วนของ Table นน ไมสามารถตงมาตรฐานไดอยางชดเจน การกำหนดมาตรฐานคราวๆ ของตารางกจะเปน (1) การบงคบความกวางของตารางและ (2) style กจะมการกำหนดขนาดแบบ font, ส
ความกวางของตาราง
เทาทจะตองมการทำกระดาษแบบ landscape ดวย แตไวสรปในเวลาตอไป ตอนนเปนมาตรฐานแนวตงไปกอน
1. ตารางกวางไดงสด 6.8" แนวตง สวนแนวนอนยงไมไดรองรบในขณะน
1. ตารางมขนาดไดงแต 5.8" - 6.8" เทานน เวนแตจะไดบการยอมรบแล
1. รวมทงสวนของลายเซนกเชนกน จะตองเปน table กวางไม <= 6.8"
1. ในกรณในรายงานมหลายตารางในหนาเดยวกน ความกวางของรายงานจะตองมความกวางเทากนทงหมด แมาจะมจำนวน column ไมเทากน หรออยางไรกตามครบ กปรบใหนเทากนซะ
#### การกำหนดขนาดของ Table
จากเดมทปแบบจะเป
t = Table(data, style=xxxxxxxxx)
จะมวแปรเพมขนมาเป
t = Table(data,
colWidths=[0.25*inch, 1.25*inch, 2.0*inch, 1.25*inch, 1.25*inch, 1.0*inch],
style=xxxxxxxxx
)
หรอจะใชเป
t = Table(data,
colWidths=[0.25*inch, 1.25*inch, 2.0*inch, 1.25*inch, 1.25*inch, 1.0*inch]
)
t.setStyle(TableStyle(xxxxxx))
จะสงเกตเหนได`colWidths`การกำหนดตวเลขชดเจน เปนความกวางของตารางทงหมด (กำหนดดวยบรรทดท column มากทด สวนเรอง SPAN มนจดการใหตรงกบความกวางเองครบ) สงทอธบายไดอ ความกวางของตารางทงหมดคอ 0.25 + 1.25 + 2 + 1.25 + 1.25 + 1 = 7 แสดงวา ตารางนความกวางเกนทกำหนดไว (จรงๆแลวมนคอ กวางเกนสวนของ Paragraph จากซายถงขวาดวย มนจะไมสวยครบ) จะตองแกไขใหได 6.8 หรอนอยกวา เชน 0.25 + 1.25 + 2 + 1.15 + 1.15 + 1 = 6.8 ใหไดเทากบ 6.8
#### การกำหนด style
วนนจะขนกบตวแปร style_tab
from core.views.pdfs import style_tab
วนการใชงานแทนทจะเขยนลงไปชดเจนในสวนของ fontface, fontsize กจะกลายเป
number_table_style = [
('FONTNAME', (0,0), (-1,-1), style_tab['font']),
('INNERGRID', (0,0), (-1,-1), 0.5 , style_tab['header_bg']),
('FONTSIZE', (0, 0), (-1, -1), 13),
('BOTTOMPADDING', (0, 0), (-1, -1), 4),
('FONTNAME', (0,0), (8,2), style_tab['header_font']),
('ALIGN',(1,4),(-1,-1),'LEFT'),
('ALIGN',(2,4),(-1,-1),'RIGHT'),
('BACKGROUND',(0,0),(8,2), style_tab['header_bg']),
('SPAN',(0,0),(0,2)),
('ALIGN',(0,0),(0,2),'CENTER'),
('VALIGN',(0,0),(0,2),'MIDDLE'),
('SPAN',(1,0),(1,2)),
('ALIGN',(1,0),(1,2),'CENTER'),
('VALIGN',(1,0),(1,2),'MIDDLE'),
('SPAN',(-7,0),(-2,0)),
('ALIGN',(-7,0),(-2,0),'CENTER'),
('SPAN',(8,0),(8,2)),
('ALIGN',(8,0),(8,2),'CENTER'),
('VALIGN',(8,0),(8,2),'MIDDLE'),
('SPAN',(2,1),(4,1)),
('ALIGN',(2,1),(4,1),'CENTER'),
('SPAN',(5,1),(7,1)),
('ALIGN',(5,1),(7,1),'CENTER'),
('SPAN',(0,3),(8,3)),
('SPAN',(0,-1,),(1,-1)),
('FONTNAME', (0,-2), (8,-1), style_tab['header_font']),
('LINEABOVE', (0,0), (-1,-1), 0.5 , style_tab['header_bg']),
('LINELEFT', (0,0), (-1,-1), 0.5 , style_tab['header_bg']),
('GRID', (0,0), (-1,-1), 0.5 , style_tab['grid_color']),
]
จะสงเกตได`style_tab` จะไปทดแทนการกำหนดสน, ส border, fontface, fontsize ทงหมดจากเดมทจะใช `colors.grey`, 'TH Sarabun New' เปนตน สงทสามารถเรยกไดจาก `style_tab`
* `style_tab['font']` -- คอ font ปกตในตาราง
* `style_tab['header_font']` -- คอ font ตวหนา
* `style_tab['header_bg']` -- คอ สนของหวตาราง (สเทา)
* `style_tab['fontsize']` -- คอ ขนาด font
* `style_tab['grid_color']` -- คอ สของ border ของตาราง

19
_posts/2013-12-23-auto-people-id.md

@ -0,0 +1,19 @@
---
layout: post
title: "เลขประจำตวประชาชนอตโนม"
date: 2013-12-23
tags: people_id
---
เลขอตโนมสำหรบบคคลทไมเลข 13 หลก ระบบจะสรางเลขอตโนมนตามน เพอปองกนโอกาสทจะเกดเลขซำซอนข
if this returns auto, then we make up people_id for the system.
Pxx1387767388 (13-char ID)
| | |
| | -- UTC UNIX Timestamp (it should be 10-digit for a while)
| -------- first digits of sha1(school_id)
| > this should make it more immune to duplicate
---------- P -- showing that it's AUTO people_id
This way -- It's not possible to have a duplicate ID..
time machine isn't existed yet.

24
_posts/2014-11-04-errorcode.md

@ -0,0 +1,24 @@
---
layout: post
title: "PSISv2 Error Code"
date: 2014-11-04
tags: error
---
Error definitions are as following:
* `4A0G` school.report.miscsupport
* calculate_actual_support
* there is no ms_actual
* `4A1G` school.report.miscsupport
* get_actual_for
* Blank student queryset
* `4E0G` school.report.miscsupport
* get_estimated_for
* Blank student queryset
* `5B0P` school.views.classrooms.ClassroomOperations post()
* delete command on student -- normally impossible case
* `9A1G` people.views.PeopleSyncView get()
* `9A1P` people.views.PeopleSyncView post()
* `9A2G` people.views.PeopleExporter get()
* `9A2P` people.views.PeopleExporter post()

70
_posts/2014-11-10-admin-command.md

@ -0,0 +1,70 @@
---
layout: post
type: handbook
title: "Admin Commands"
date: 2014-11-10
tags: command admin
---
These are checklist admin needs to get done.
* [งขอมลจาก PSIS v1](#psis-v1)
* [คำสงตรวจสอบปญหาตางๆ](#section)
* [คำสงเกบประมวลผลขอม](#section-1)
* [คำสงอนๆ](#section-2)
## ดงขอมลจาก PSIS v1
เรมกนทคำสงสำหรบการดงขอมลเกาเลย หลกการคลายกน คอ กำหนด `school_id` ไดตามชอบใจ ถาไมครบมนจะ search ดวยรหสทมลงไปเปนตวเรมต
* `$ ./manage.py <command> <school_id>`
นนอจดการของโรงเรยนทองการ
* `$ ./manage.py <command> 1010`
นนอจดการของโรงเรยนทรหสโรงเรยนขนตนดวย `1010`งหมด
* `$ ./manage.py <command> all`
นนอจดการของทกโรงเรยน ซงไมแนะนำเลยเพราะแยกเปนหลาย process จะเรวกวามากน
คำสงทของชดน
* `import_v1_bank`
* `import_v1_class_rel`
* `import_v1_classroom`
* `import_v1_employee`
* `import_v1_sinfo`
* `import_v1_student`
* `import_v1_address`
* `import_v1_people`
เพอทจะใหไดอมลของโรงเรยนทสมบรณน จะตองทำตามคำสงตอไปน
* `import_v1_people`
* `import_v1_student`, `import_v1_employee`, `import_v1_classroom`
* `import_v1_sinfo`, `import_v1_address`, `import_v1_bank`, `import_v1_class_rel`
โดยในขอเดยวกนลำดบไมความสำคญ จะเรมอนไหนกอนกไมญหา การนำเขาขอมลนน โดยมากจะมการลบขอมลในระบบ PSISv2 กอนเสมอ กอนทจะนำเขาใหมงนน เมอมการเปลยนแปลงขอมลใน PSISv2 แลว กไมควรทจะใชการนำเขาแบบนกเลย
## คำสงตรวจสอบปญหาตางๆ
* `check_teacher_issue`
* `check_student_issue`
## คำสงเกบประมวลผลขอม
* `run_misc_support` -- ขอมลเรมตนสำหรบอดหนนทางการศกษา
* `db_builder` -- บงคบใหระบบประมวลผลเงนอดหนนเรยนฟร 15 ป (เพอจะไดการแสดงผลในสวนของสำนกงาน ไมเชนนนจะตองรอใหโรงเรยนเปดรายงานกอน)
* `mongo_report` -- รายงาน อน. และเงนเดอน
* `mongo_stat` -- สถในสวนใหญใน _TOR ขอ 4.3_
* `mongo_yearly_stat` -- สถ URL เรมตนดวย `/yrly/`
* `archive_students_transfer` -- [**] จำเปนตองสงทำงานวนแรกของเดอน เพอความถกตองของระบบ
## คำสงอนๆ
* `backfill_reviews` -- ทำงานโดยการใส review record ไวสำหรบขอมลทจำเปนตองมการตรวจสอบ
* `prefix_filler` -- ใสเพศใหบ record ทงไมใชเพอความถกตองของขอมล Statistics เทานน (เทาทดออก)

113
_posts/2014-11-10-admin-todo-list.md

@ -0,0 +1,113 @@
---
layout: post
type: handbook
title: "Todo List"
date: 2014-11-10
tags: todo admin
---
These are checklist admin needs to get done.
* [On June 10](#june-10)
* [At the beginning of the month](#at-the-beginning-of-the-month)
* [On Nov 10](#november-10)
* [On Feb 15](#february-15)
* [At the end of Febuary](#at-the-end-of-febuary)
### June 10
* backup PostgreSQL
* backup and tar MongoDB
* cleanup everything first (should take < 10 mins for all)
* `backfill_reviews`
* `check_student_issue`
* `check_teacher_issue`
* `archive_issues`
* `cleanup_glitches`
* `mongo_report --date=20xx0610 --report=yearly`
* It's much better to have 1, 2, 3, ..., 9 separately (much faster)
* `run_misc_support --date=20xx0610`
* it's also a good idea to separate into 1, 2, 3, 4, 5, ..., 9 or it could take > 5 hours to finish
* with i5 & SSD, 9 takes little over 1:30 hour
* `mongo_yearly_stat --date=20xx0610 all`
Pre-compile report for office
on `/office/opec/stat/` & `/misc_support/` (on ztokyo3 contained enough tools)
* `staticsitegen`
* don't forget to change code for `Jun10Renderer` & `MiscSupportJun10Renderer`
* `MiscSupportJun10Renderer` alone takes roughly 35 mins on i5 and SSD
* `./toolkit/__meduza_cleanup.sh`
* `~/bin/sync_psis_meduza.sh`
* double check if data is there,
* `/office/opec/stat/`
* `/misc_support/` แบบสรปเบกจร
* `/misc_support/` ภาคเรยนท 1, PDF
### At the beginning of the month
If it's March 1st, there is an extra work below.
* backup PostgreSQL
* backup and tar MongoDB
* cleanup everything first (should take < 10 mins for all)
* `backfill_reviews`
* `check_student_issue`
* `check_teacher_issue`
* `archive_issues`
* `cleanup_glitches`
* `mongo_report --date=20xxyy01 --report=monthly`
* It's much better to have 1, 2, 3, ..., 9 separately (much faster)
* visit `/sub4sum/` page to invoke
* `sub4sum`
* `sub4sum_office`
* `archive_students_transfer` - This usually throws 100k tasks to Celery which takes > 5 hours to complete.
### November 10
The process is simple, but it takes time to get jobs done.
* backup PostgreSQL
* backup and tar MongoDB
* `run_misc_support --date=20xx1110`
* it's a good idea to separate into 1, 2, 3, 4, 5, ..., 9 or it could take > 5 hours to finish
* processed on tokyo1 & 3 simultaneously took only < 15 mins to get all things done
* note load distributes throughout every app & DB servers. No hard hit at all. That's why it runs smoothly fast here.
* `mongo_report --date=20xx1110 --report=ms_nov10`
* 1 takes less than 10 minutes to complete (most work are done in run_misc_support already.
* note this does take its toll on ztokyo2 though. DB server gets hit hard at 100% every cores. Thus, it's oddly taking longer than run_misc_support in production.
Pre-compile report for office on `/misc_support/` too. (on ztokyo3 contained enough tools)
* staticsitegen -- don't forget to change code for Nov10Renderer
* This takes > 1:15 to finish on i5 & SSD; meduza is a blocking single process, so it doesn't get any better on ztokyo3, 1:35 it took on Nov 10, 2014
* `./toolkit/__meduza_cleanup.sh`
* `~/bin/sync_psis_meduza.sh`
* double check if data is there,
* แบบสรปเบกจรง 10 พย.
* ภาคเรยนท 2, PDF
### February 15
* backup PostgreSQL
* backup and tar MongoDB
* make sure ms_rate is fulfilled
* `mongo_report --date=20xx0215 --report=ms_feb15`
Pre-compile report for office on `/misc_support/` too. (on ztokyo3 contained enough tools)
* staticsitegen -- don't forget to change code for Feb15Renderer
* `./toolkit/__meduza_cleanup.sh`
* `~/bin/sync_psis_meduza.sh`
* double check if data is there,
* สรปขอเบกประมาณการ
### At the end of Febuary
This is an extra work from **at the beginning of the month**
* `mongo_yearly_stat --date=20xx0215 all`
* It's much better to have 1, 2, 3, ..., 9 separately (much faster)

27
handbook.md

@ -0,0 +1,27 @@
---
layout: page
title: "Handbook"
date: 2014-12-12
tags:
---
* [Admin Todo List][todolist]
* [Admin Commands][command]
* [Setup][setup]
* [Milestone][milestone]
* [psisRecord][psisrecord]
* [PDF styling][pdfstyling]
* [ReportLab 101][reportlab]
[todolist]: /2014/11/admin-todo-list
[setup]: /2014/11/app-setup
[command]: /2014/11/admin-command
[milestone]: /2013/10/milestone
[psisrecord]: /2013/11/psis-record
[pdfstyling]: /2013/12/pdf-styling
[reportlab]: /2013/10/reportlab-101

2
index.html

@ -5,10 +5,12 @@ layout: default
<div class="home">
<ul class="post-list">
{% for post in site.posts %}
{% if post.type != 'handbook' %}
<li>
<span class="post-meta">{{ post.date | date: "%b %-d, %Y" }}</span>
<a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
</li>
{% endif %}
{% endfor %}
</ul>

Loading…
Cancel
Save