Skip to content

Instantly share code, notes, and snippets.

@elcolie
Created July 31, 2017 13:22
Show Gist options
  • Save elcolie/057d75c0e5adf61d1ffbdf55b271e72a to your computer and use it in GitHub Desktop.
Save elcolie/057d75c0e5adf61d1ffbdf55b271e72a to your computer and use it in GitHub Desktop.
import functools
@functools.total_ordering
class GIRow:
def __init__(self, dmd_name: str, md_name: str, rtr_name: str,
province: str, district: str, sub_district: str, address: str, node_type: str, node_alive: bool, imei: str,
goodsmovement_dt: str, active_user: str, user_node: str, profile_name: str, product_code: str):
self.dmd_name = dmd_name
self.md_name = md_name
self.rtr_name = rtr_name
self.province = province
self.district = district
self.sub_district = sub_district
self.address = address
self.node_type = node_type
self.node_alive = node_alive
self.imei = imei
self.goodsmovement_dt = goodsmovement_dt
self.active_user = active_user
self.user_node = user_node
self.profile_name = profile_name
self.product_code = product_code
def __str__(self):
return f"{self.dmd_name} {self.md_name} {self.rtr_name} {self.imei}"
def __eq__(self, other):
return self.node_type == other.node_type
def __lt__(self, other):
"""This is customization because Node-Type is mixed up between EN and Thai"""
result = super().__lt__(other)
if self.node_type == 'D' and other.node_type == 'สาขา sub-D':
return self.node_type < other.node_type
elif self.node_type == 'D' and other.node_type == 'RTR':
return self.node_type < other.node_type
elif self.node_type == 'สาขา sub-D' and other.node_type == 'RTR':
return self.node_type < other.node_type
else:
return self.node_type > other.node_type
from operator import attrgetter
from django.test import TestCase
from yaoms.apps.module.reports.utils import GIRow
class GIRowSortingTest(TestCase):
def setUp(self):
self.node_d1 = GIRow(
'-', '-', '-', None, None, None, None, 'D', None,
'357291087318907', None, None, None, None, None
)
self.node_d2 = GIRow(
'-', '-', '-', None, None, None, None, 'D', None,
'357291087318909', None, None, None, None, None
)
self.node_d3 = GIRow(
'-', '-', '-', None, None, None, None, 'D', None,
'357291087318905', None, None, None, None, None
)
self.node_md1 = GIRow(
'โคราชนวกิจ คอมมูนิเคชั่น จำกัด', '(TWZ By โคราชนวกิจ) [โคราชนวกิจ คอมมูนิเคชั่น นครราชสีมา]', '-',
'นครราชสีมา', 'เมือง', 'ในเมือง', 'ศูนย์การค้าเทอร์มินอล 21 ห้องเลขที่ 3006 ชั้น 3', 'สาขา sub-D', True,
'356015087104947', '22/05/2017', '0827578773', '(TWZ By โคราชนวกิจ) [โคราชนวกิจ คอมมูนิเคชั่น นครราชสีมา]',
'(TWZ By โคราชนวกิจ) [โคราชนวกิจ คอมมูนิเคชั่น นครราชสีมา]', 'SP1-S12NO41201I'
)
self.node_md2 = GIRow(
'ไอบิส พลัส เน็ทเวอร์ค จำกัด',
'บริษัทไอบิส พลัส เน็ทเวอร์ค จำกัด(จ.นครปฐม) [ไอบิส พลัส เน็ทเวอร์ค สนง.ใหญ่ นครปฐม]', '-', 'นครปฐม',
'เมือง', 'พระปฐมเจดีย์', '55 ถ.ราชวิถี', 'สาขา sub-D', True, '356015087104988', '08/06/2017', '0801113679',
'บริษัทไอบิส พลัส เน็ทเวอร์ค จำกัด(จ.นครปฐม) [ไอบิส พลัส เน็ทเวอร์ค สนง.ใหญ่ นครปฐม]',
'บริษัทไอบิส พลัส เน็ทเวอร์ค จำกัด(จ.นครปฐม) [ไอบิส พลัส เน็ทเวอร์ค สนง.ใหญ่ นครปฐม]', 'SP1-S12NO41201I'
)
self.node_md3 = GIRow('ไอ.เทค พลัส ดิสทริบิวชั่น จำกัด',
'บริษัทไอ.เทค พลัส ดิสทริบิวชั่น จำกัด(จ.ปราจีนบุรี) [ไอ.เทค พลัส ดิสทริบิวชั่น สนง.ใหญ่ ปราจีนบุรี]',
'-', 'ปราจีนบุรี', 'เมือง', 'หน้าเมือง', '147/2 ถ.ราษฎรดำริ', 'สาขา sub-D', True,
'356015087105001', '25/05/2017', '0812449999',
'บริษัทไอ.เทค พลัส ดิสทริบิวชั่น จำกัด(จ.ปราจีนบุรี) [ไอ.เทค พลัส ดิสทริบิวชั่น สนง.ใหญ่ ปราจีนบุรี]',
'บริษัทไอ.เทค พลัส ดิสทริบิวชั่น จำกัด(จ.ปราจีนบุรี) [ไอ.เทค พลัส ดิสทริบิวชั่น สนง.ใหญ่ ปราจีนบุรี]',
'SP1-S12NO41201I')
self.node_md4 = GIRow('ไมโคโมไบดิส จำกัด (WAP)',
'บริษัทไมโคโมไบดิส จำกัด (WAP)(จ.ชลบุรี) [บจ.ไมโคโมไบดิส สนง.ใหญ่ ชลบุรี]', '-', 'ชลบุรี',
'บ้านบึง', 'บ้านบึง', '8 ชั้นที่ 2ถ.บวรสถิตย์', 'สาขา sub-D', True, '356015087105043',
'20/05/2017', '0830007773',
'บริษัทไมโคโมไบดิส จำกัด (WAP)(จ.ชลบุรี) [บจ.ไมโคโมไบดิส สนง.ใหญ่ ชลบุรี]',
'บริษัทไมโคโมไบดิส จำกัด (WAP)(จ.ชลบุรี) [บจ.ไมโคโมไบดิส สนง.ใหญ่ ชลบุรี]',
'SP1-S12NO41201I')
self.node_md5 = GIRow('ไอ.เทค คอม กรุ๊ป จำกัด',
'บริษัทไอ.เทค คอม กรุ๊ป จำกัด(จ.สระบุรี) [ไอ.เทค คอม กรุ๊ป จำกัด สนง.ใหญ่ สระบุรี]', '-',
'สระบุรี', 'เมือง', 'ปากเพรียว', '325/49-51ถ.เทศบาล 2', 'สาขา sub-D', True,
'356015087105068',
'22/05/2017', '0811777744',
'บริษัทไอ.เทค คอม กรุ๊ป จำกัด(จ.สระบุรี) [ไอ.เทค คอม กรุ๊ป จำกัด สนง.ใหญ่ สระบุรี]',
'บริษัทไอ.เทค คอม กรุ๊ป จำกัด(จ.สระบุรี) [ไอ.เทค คอม กรุ๊ป จำกัด สนง.ใหญ่ สระบุรี]',
'SP1-S12NO41201I')
self.node_md6 = GIRow('โอเอ เทเลคอม แอนด์ เซอร์วิส จำกัด',
'บริษัทโอเอ เทเลคอม แอนด์ เซอร์วิส จำกัด(จ.นครศรีธรรมราช) [โอเอ เทเลคอม แอนด์ เซอร์วิส สนง.ใหญ่ นครศรีธรรมราช]',
'-', 'นครศรีธรรมราช', 'เมือง', 'คลัง',
'89/12-13 อาคาร เฟิสท์ซิตี้ช้อปปิ้งเซ็นเตอร์ถ.พัฒนาการคูขวาง', 'สาขา sub-D', True,
'356015087105084', '28/05/2017', '0992366565',
'บริษัทโอเอ เทเลคอม แอนด์ เซอร์วิส จำกัด(จ.นครศรีธรรมราช) [โอเอ เทเลคอม แอนด์ เซอร์วิส สนง.ใหญ่ นครศรีธรรมราช]',
'บริษัทโอเอ เทเลคอม แอนด์ เซอร์วิส จำกัด(จ.นครศรีธรรมราช) [โอเอ เทเลคอม แอนด์ เซอร์วิส สนง.ใหญ่ นครศรีธรรมราช]',
'SP1-S12NO41201I')
self.node_md7 = GIRow('ไอ.เทค คอม กรุ๊ป จำกัด',
'บริษัทไอ.เทค คอม กรุ๊ป จำกัด(จ.สระบุรี) [ไอ.เทค คอม กรุ๊ป จำกัด สนง.ใหญ่ สระบุรี]', '-',
'สระบุรี', 'เมือง', 'ปากเพรียว', '325/49-51ถ.เทศบาล 2', 'สาขา sub-D', True,
'356015087105142',
'22/05/2017', '0811777744',
'บริษัทไอ.เทค คอม กรุ๊ป จำกัด(จ.สระบุรี) [ไอ.เทค คอม กรุ๊ป จำกัด สนง.ใหญ่ สระบุรี]',
'บริษัทไอ.เทค คอม กรุ๊ป จำกัด(จ.สระบุรี) [ไอ.เทค คอม กรุ๊ป จำกัด สนง.ใหญ่ สระบุรี]',
'SP1-S12NO41201I')
self.node_rtr1 = GIRow('ไมโคโมไบดิส จำกัด (WAP)', '-', 'สไมล์ โมบาย', 'ชลบุรี', 'บ่อทอง', 'บ่อทอง', '169 ม.1',
'RTR', True, '356020083698058', '11/07/2017', '020165777', 'Yas', 'Yas',
'SP1-S12NA06000I')
self.node_rtr2 = GIRow('ไมโคโมไบดิส จำกัด (WAP)', '-', 'สไมล์ โมบาย', 'ชลบุรี', 'บ่อทอง', 'บ่อทอง', '169 ม.1',
'RTR', True, '356020083712842', '11/07/2017', '020165777', 'Yas', 'Yas',
'SP1-S12NA06000I')
self.node_rtr3 = GIRow('เอทีเอช แอซเซ็ท จำกัด (SP)', '-', 'พี อาร์ ที คอร์ปอเรชั่น', 'บุรีรัมย์', 'เมือง',
'ในเมือง', '448/19-20 ถ.จิระ', 'RTR', True, '356024080085368', '12/07/2017',
'0818766666',
'เอทีเอช แอซเซ็ท จำกัด (SP)', 'เอทีเอช แอซเซ็ท จำกัด (SP)', 'SP1-S12NA05000I')
self.node_rtr4 = GIRow('โมบายช็อป', '-', 'บริษัท โมบาย ไฮเทค คอร์ปอเรชั่น จำกัด', 'เชียงราย', 'เมือง',
'รอบเวียง',
'รอบเวียง', 'RTR', True, '356024080089055', '12/07/2017', '0818766666',
'เอทีเอช แอซเซ็ท จำกัด (SP)', 'เอทีเอช แอซเซ็ท จำกัด (SP)', 'SP1-S12NA05000I')
self.node_rtr5 = GIRow('สมาร์ท ดิสทริบิวชั่น จำกัด', '-', 'ยะรังโมบาย', 'ปัตตานี', 'ยะรัง', 'ยะรัง', '206 3',
'RTR', True,
'356024080388267', '07/07/2017', '0873913999',
'Van 2 (PDV) [บจ.สมาร์ท ดิสทริบิวชั่น ยะลา]',
'Van 2 (PDV) [บจ.สมาร์ท ดิสทริบิวชั่น ยะลา]', 'SP1-S12NA05001I')
self.node_rtr6 = GIRow('สมาร์ท ดิสทริบิวชั่น จำกัด', '-', 'ยะรังโมบาย', 'ปัตตานี', 'ยะรัง', 'ยะรัง', '206 3',
'RTR', True,
'356024080915226', '07/07/2017', '0873913999',
'Van 2 (PDV) [บจ.สมาร์ท ดิสทริบิวชั่น ยะลา]',
'Van 2 (PDV) [บจ.สมาร์ท ดิสทริบิวชั่น ยะลา]', 'SP1-S12NA05001I')
self.node_rtr7 = GIRow('โมบายช็อป', '-', 'ร้าน แม่อายเซอร์วิสช็อป', 'เชียงใหม่', 'แม่อาย', 'มะลิกา', 'มะลิกา',
'RTR', True, '356803080346379', '11/07/2017', '0987495265', 'ร้าน แม่อายเซอร์วิสช็อป',
'ร้าน แม่อายเซอร์วิสช็อป', 'SP1-S12NA03002I')
def test_sort_pure_d(self):
problem = [self.node_d1, self.node_d2, self.node_d3]
result = sorted(problem, key=attrgetter('node_type', 'dmd_name', 'md_name', 'rtr_name', 'imei'))
self.assertEqual('357291087318905', result[0].imei)
self.assertEqual('357291087318907', result[1].imei)
self.assertEqual('357291087318909', result[2].imei)
def test_sort_pure_md(self):
problem = [self.node_md1, self.node_md2, self.node_md3, self.node_md4, self.node_md5, self.node_md6,
self.node_md7]
result = sorted(problem, key=attrgetter('node_type', 'dmd_name', 'md_name', 'rtr_name', 'imei'))
self.assertEqual('โคราชนวกิจ คอมมูนิเคชั่น จำกัด', result[0])
self.assertEqual('โอเอ เทเลคอม แอนด์ เซอร์วิส จำกัด', result[1])
self.assertEqual('ไมโคโมไบดิส จำกัด (WAP)', result[2])
self.assertEqual('ไอ.เทค คอม กรุ๊ป จำกัด', result[3])
self.assertEqual('ไอ.เทค คอม กรุ๊ป จำกัด', result[4])
self.assertEqual('ไอ.เทค คอม กรุ๊ป จำกัด', result[5])
self.assertEqual('ไอ.เทค พลัส ดิสทริบิวชั่น จำกัด', result[6])
self.assertEqual('ไอบิส พลัส เน็ทเวอร์ค จำกัด', result[7])
def test_sort_pure_rtr(self):
problem = [self.node_rtr1, self.node_rtr2, self.node_rtr3, self.node_rtr4, self.node_rtr5, self.node_rtr6,
self.node_rtr7]
result = sorted(problem, key=attrgetter('node_type', 'dmd_name', 'md_name', 'rtr_name', 'imei'))
self.assertEqual('สมาร์ท ดิสทริบิวชั่น จำกัด - ยะรังโมบาย 356024080388267', str(result[0]))
self.assertEqual('สมาร์ท ดิสทริบิวชั่น จำกัด - ยะรังโมบาย 356024080915226', str(result[1]))
self.assertEqual('เอทีเอช แอซเซ็ท จำกัด (SP) - พี อาร์ ที คอร์ปอเรชั่น 356024080085368', str(result[2]))
self.assertEqual('โมบายช็อป - บริษัท โมบาย ไฮเทค คอร์ปอเรชั่น จำกัด 356024080089055', str(result[3]))
self.assertEqual('โมบายช็อป - ร้าน แม่อายเซอร์วิสช็อป 356803080346379', str(result[4]))
self.assertEqual('ไมโคโมไบดิส จำกัด (WAP) - สไมล์ โมบาย 356020083698058', str(result[5]))
self.assertEqual('ไมโคโมไบดิส จำกัด (WAP) - สไมล์ โมบาย 356020083712842', str(result[6]))
def test_sort_mixed_d_md(self):
problem = [self.node_md1, self.node_md2, self.node_md3, self.node_md4, self.node_md5, self.node_md6,
self.node_md7] + \
[self.node_d1, self.node_d2, self.node_d3]
result = sorted(problem, key=attrgetter('node_type', 'dmd_name', 'md_name', 'rtr_name', 'imei'))
self.assertEqual('- - - 357291087318905', str(result[0]))
self.assertEqual('- - - 357291087318907', str(result[1]))
self.assertEqual('- - - 357291087318909', str(result[2]))
self.assertEqual(
'โคราชนวกิจ คอมมูนิเคชั่น จำกัด (TWZ By โคราชนวกิจ) [โคราชนวกิจ คอมมูนิเคชั่น นครราชสีมา] - 356015087104947',
str(result[3]))
self.assertEqual(
'โอเอ เทเลคอม แอนด์ เซอร์วิส จำกัด บริษัทโอเอ เทเลคอม แอนด์ เซอร์วิส จำกัด(จ.นครศรีธรรมราช) [โอเอ เทเลคอม แอนด์ เซอร์วิส สนง.ใหญ่ นครศรีธรรมราช] - 356015087105084',
str(result[4]))
self.assertEqual(
'ไมโคโมไบดิส จำกัด (WAP) บริษัทไมโคโมไบดิส จำกัด (WAP)(จ.ชลบุรี) [บจ.ไมโคโมไบดิส สนง.ใหญ่ ชลบุรี] - 356015087105043',
str(result[5]))
self.assertEqual(
'ไอ.เทค คอม กรุ๊ป จำกัด บริษัทไอ.เทค คอม กรุ๊ป จำกัด(จ.สระบุรี) [ไอ.เทค คอม กรุ๊ป จำกัด สนง.ใหญ่ สระบุรี] - 356015087105068',
str(result[6]))
self.assertEqual(
'ไอ.เทค คอม กรุ๊ป จำกัด บริษัทไอ.เทค คอม กรุ๊ป จำกัด(จ.สระบุรี) [ไอ.เทค คอม กรุ๊ป จำกัด สนง.ใหญ่ สระบุรี] - 356015087105142',
str(result[7]))
self.assertEqual(
'ไอ.เทค พลัส ดิสทริบิวชั่น จำกัด บริษัทไอ.เทค พลัส ดิสทริบิวชั่น จำกัด(จ.ปราจีนบุรี) [ไอ.เทค พลัส ดิสทริบิวชั่น สนง.ใหญ่ ปราจีนบุรี] - 356015087105001',
str(result[8]))
self.assertEqual(
'ไอบิส พลัส เน็ทเวอร์ค จำกัด บริษัทไอบิส พลัส เน็ทเวอร์ค จำกัด(จ.นครปฐม) [ไอบิส พลัส เน็ทเวอร์ค สนง.ใหญ่ นครปฐม] - 356015087104988',
str(result[9]))
def test_sort_mixed_d_md_rtr(self):
problem = [self.node_rtr1, self.node_rtr2, self.node_rtr3, self.node_rtr4, self.node_rtr5, self.node_rtr6,
self.node_rtr7] + \
[self.node_md1, self.node_md2, self.node_md3, self.node_md4, self.node_md5, self.node_md6,
self.node_md7] + \
[self.node_d1, self.node_d2, self.node_d3]
result = sorted(problem, key=attrgetter('node_type', 'dmd_name', 'md_name', 'rtr_name', 'imei'))
pass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment