취미삼아 배우는 프로그래밍

Django로 개인 업무(ERP) 홈페이지 만들기-6 본문

파이썬(장고)

Django로 개인 업무(ERP) 홈페이지 만들기-6

Nadure 2020. 11. 16. 20:25

진행상황

 

Information List를 작성하는것까지 만들었다.

 

어쩌다보니 테이블을 되게 정성스럽게 만들었다.

 

def order_manage(request):
    template_name = "order_list_page.html"

    qs = IntegratedInfo.objects.filter(is_completed=False).order_by('rank_number')

    # 아.. 최적화는 나중에 하고 일단 결과부터 만들자.
    # TODO 최적화 필요할듯! Debug Toolbar 확인필요
    filar_list = []
    panel_list = []
    for res in qs:
        pan = res.panel_infos
        fil = res.filar_infos
        filar_list.append(fil)
        panel_list.append(pan)

    
    qs_dict = list(qs.annotate(
        company_name=F('base_data__base__company'),
        location_name=F('base_data__base__location'),
        district_name=F('base_data__district'),
    ).values())

    qs_list = []
    for panel, filar, qs_new in zip(panel_list, filar_list, qs_dict):
        qs_new['panel_info'] = panel
        qs_new['filar_info'] = filar
        qs_new['process'] = 'None'
        qs_list.append(qs_new)

    table = OrderTable(qs_list)
    context = {
        "table":table
        }
    return render(request, template_name, context)

 쿼리셋 안에 또 쿼리셋 결과를 넣는거는 이렇게 밖에 생각이 안난다. 최적화는 못했지만, 결론적으로 최적화를 덜 하기 위해서 Pagination을 사용하게 된다면, 성능부분에 있어서는 좀 괜찮을 것 같다.

이렇게 만든 qs_dict를 테이블에 넣어서 강제적으로 테이블을 뽑아낸다.

 

그리고 테이블을 만드는 코드는 아래와 같이 작성했다.

import django_tables2 as tables
from standardwall.models import *
from django.utils.safestring import mark_safe
from django.urls import reverse

def dropdown_check_helper(value):
    if value:
        return '<i class="material-icons">check_box</i>'
    else:
        return '<i class="material-icons">check_box_outline_blank</i>'

def tooltip_string_helper(record):
    string_base = ''
    if record['is_order_printed']:
        string_base += '오더 : 인쇄함<br>'
    else:
        string_base += '오더 : 인쇄안함<br>'

    if record['is_barcode_printed']:
        string_base += '바코드 : 인쇄안함'
    else:
        string_base += '바코드 : 인쇄안함'
    
    return string_base

class OrderTable(tables.Table):
    company_name = tables.Column(verbose_name="업체명")
    location_name = tables.Column(verbose_name="현장명")
    district_name = tables.Column(verbose_name="동")
    filar_maded = tables.Column(verbose_name="제작반",)
    panel_info = tables.Column(verbose_name="판넬정보")
    memo = tables.Column(verbose_name="비고")
    process = tables.Column(verbose_name="진행상황")

    class Meta:
        # model = IntegratedInfo
        fields = ('company_name', 'location_name', 
            'district_name', 'filar_maded', 'panel_info', 'memo', 'process',)
        
        row_attrs = {
            "data-id": lambda record: record['id']
        }

    def render_panel_info(self, value, record):
        res_string = ''
        for filar in record['filar_info']:
            if int(filar) != 0:
                res_string += str(filar) + ','
        res_string = res_string[0:len(res_string)-1]

        if res_string != '':
            res_string += '필라, '
        
        for panel in record['panel_info']:
            res_string += str(panel) + ','
        res_string = res_string[0:len(res_string)-1]
        return res_string

    def render_process(self, value, record):
        component = f'''
          <!-- Dropdown Trigger -->
            <a class='dropdown-trigger btn tooltipped' href='#' 
                data-position="top" 
                data-tooltip="{tooltip_string_helper(record)}"
                data-target='dropdown{record['id']}' >
                {dropdown_check_helper(record['is_order_printed'])}
                {dropdown_check_helper(record['is_barcode_printed'])}
            </a>

            <!-- Dropdown Structure -->
            <ul id='dropdown{record['id']}' class='dropdown-content'>
                <li><a href="#!">바코드 체크</a></li>
                <li><a href="#!">완료 체크</a></li>
                <li class="divider" tabindex="-1"></li>
                <li><a href="{
                    reverse('detailed_order', 
                    kwargs={'id':int(record['id']) })
                    }">오더 보기</a></li>
            </ul>
        '''
        return mark_safe(component)
    

설명하기도 어렵다.

 

그렇게해서 이제 거의 다 했구나!!! 생각했는데,

이놈을
이케

어,,

어?

300, 400, 450, 600에 관한 내용 자체가 없다.

 

아 큰일이다. 시작부터 잘못됐다. 이거 아예 근본이 틀려먹은 상황.

글을 쓰는 지금마저 살짝 현타가 온다. 심지어 칸 크기 조절도 잘 못하겠다.

 

어찌어찌하면 고칠수야 있겠지만, 내 목줄은 지금 여기에 있지 않다. 어차피 이거 나는 1주일도 못 쓴다. 때문에, 일단은 드랍한다.

 

그리고 새 앱을 기획한다.

 이놈의 회사는 입출고 현황표를 엑셀로 저장한다. 개개인마다 목표는 다 같지만 수식이 다 다르고 스타일도 다 다르다. 그런데 이거 숫자적다가 너무 개고생하는거 같다.

 그래서 기획해보려한다. 근데 너무 항목이 많다. ㄷㄷ,

 입고인지 출고인지를 ForeignKey로, 그리고 구분 자체는 M2M, 그리고 품목의 유형은 또 ForeignKey로?  음 일단 조금 더 생각해봐야겠다.

 

사실 이거만이면 어찌어찌 구현가능하다. 그치만

 

몇몇 항목에 있어서는 이것과 세트템이라는 사실..!(두둥탁.)

오쉣,,

Comments