При удаление файлов кнопкой "х" то бишь по одному , проблем с добавлением не возникает.Но при удаление кнопкой delete_sublist , при добавление дублируются , причем чем больше удалять кнопкой delete sublist , тем больше дублируются.
def playlist_index(request):
# start_time = time.time()
template = loader.get_template('playlist_index.html')
last_add = {}
last_add['dayslot'] = ''
last_add['box_name'] = ''
last_add['monitor_num'] = ''
last_add['media'] = ''
last_add['play_duration'] = '0'
if request.method == 'POST':
if 'up' in request.POST.keys():
rec = request.POST['up']
print(f'rec = {rec}')
box_id, day_slot_id, monitor_num, order_in_slot = rec.split(';')
order_in_slot = int(order_in_slot)
if order_in_slot > 1:
query = 'SELECT id FROM config_playlist WHERE box_id="{}" AND day_slot_id="{}" '+\
'AND monitor_num="{}" AND order_in_slot>="{}" AND order_in_slot<="{}" ORDER BY order_in_slot'
query = query.format(box_id, day_slot_id, monitor_num, order_in_slot-1, order_in_slot)
neighbour_rows = Playlist.objects.raw(query)
ids = []
for u in neighbour_rows:
ids.append(u.id)
# print('ids = {}'.format(ids))
upper = Playlist.objects.get(id=ids[0])
upper.order_in_slot += 1
upper.save()
this = Playlist.objects.get(id=ids[1])
this.order_in_slot -= 1
this.save()
elif 'down' in request.POST.keys():
rec = request.POST['down']
print(f'rec = {rec}')
box_id, day_slot_id, monitor_num, order_in_slot = rec.split(';')
order_in_slot = int(order_in_slot)
query = 'SELECT id FROM config_playlist WHERE box_id="{}" AND day_slot_id="{}" '+\
'AND monitor_num="{}" AND order_in_slot>="{}" AND order_in_slot<="{}" ORDER BY order_in_slot'
query = query.format(box_id, day_slot_id, monitor_num, order_in_slot, order_in_slot+1)
neighbour_rows = Playlist.objects.raw(query)
ids = []
for u in neighbour_rows:
ids.append(u.id)
if len(ids) > 1: # not last in slot list
this = Playlist.objects.get(id=ids[0])
this.order_in_slot += 1
this.save()
lower = Playlist.objects.get(id=ids[1])
lower.order_in_slot -= 1
lower.save()
elif 'delete' in request.POST.keys():
print('delete')
rec = request.POST['delete']
print(f'rec = {rec}')
box_id, day_slot_id, monitor_num, order_in_slot = rec.split(';')
order_in_slot = int(order_in_slot)
q = f'SELECT id FROM config_playlist WHERE box_id="{box_id}" AND day_slot_id="{day_slot_id}" '+\
f'AND monitor_num="{monitor_num}" AND order_in_slot>="{order_in_slot}" ORDER BY order_in_slot'
neighbour_rows = Playlist.objects.raw(q)
ids = []
for u in neighbour_rows:
ids.append(u.id)
for i in range(len(ids)):
if i == 0: # one that need to delete
this = Playlist.objects.get(id=ids[0])
this.delete()
else:
lower = Playlist.objects.get(id=ids[i])
lower.order_in_slot -= 1
lower.save()
cursor = connection.cursor()
q = f'SELECT COUNT(*) FROM config_playlist WHERE box_id="{box_id}" AND day_slot_id="{day_slot_id}" '+\
f'AND monitor_num="{monitor_num}"'
cursor.execute(q)
playlist_count = cursor.fetchone()[0]
print(f'playlist_count = {playlist_count}')
if playlist_count == 0: # no media in playlist
q = f'SELECT id, is_shuffle FROM config_pl_shuffle WHERE box_id="{box_id}" AND day_slot_id="{day_slot_id}" AND monitor_num="{monitor_num}"'
shuffle_rows = Pl_shuffle.objects.raw(q)
for s in shuffle_rows:
shuffle = Pl_shuffle.objects.get(id=s.id)
shuffle.delete()
elif 'delete_sublist' in request.POST.keys():
print('delete_sublist')
rec = request.POST['delete_sublist']
print(f'rec = {rec}')
box_id, day_slot_id, monitor_num = rec.split(';')
q = f'DELETE FROM config_playlist WHERE box_id="{box_id}" AND day_slot_id="{day_slot_id}" '+\
f'AND monitor_num="{monitor_num}"'
cursor = connection.cursor()
cursor.execute(q)
# ids = []
# for u in neighbour_rows:
# ids.append(u.id)
#
# for i in range(len(ids)):
# if i == 0: # one that need to delete
# this = Playlist.objects.get(id=ids[0])
# this.delete()
# else:
# lower = Playlist.objects.get(id=ids[i])
# lower.order_in_slot -= 1
# lower.save()
#
# cursor = connection.cursor()
# q = f'SELECT COUNT(*) FROM config_playlist WHERE box_id="{box_id}" AND day_slot_id="{day_slot_id}" '+\
# f'AND monitor_num="{monitor_num}"'
# cursor.execute(q)
# playlist_count = cursor.fetchone()[0]
# print(f'playlist_count = {playlist_count}')
# if playlist_count == 0: # no media in playlist
# q = f'SELECT id, is_shuffle FROM config_pl_shuffle WHERE box_id="{box_id}" AND day_slot_id="{day_slot_id}" AND monitor_num="{monitor_num}"'
# shuffle_rows = Pl_shuffle.objects.raw(q)
# for s in shuffle_rows:
# shuffle = Pl_shuffle.objects.get(id=s.id)
# shuffle.delete()
elif 'shuffle_switch' in request.POST.keys():
print('shuffle_switch')
rec = request.POST['shuffle_switch']
print(f'rec = {rec}')
box_id, day_slot_id, monitor_num, is_shuffle = rec.split(';')
q = f'SELECT id, is_shuffle FROM config_pl_shuffle WHERE box_id="{box_id}" AND day_slot_id="{day_slot_id}" AND monitor_num="{monitor_num}"'
shuffle_rows = Pl_shuffle.objects.raw(q)
for s in shuffle_rows:
shuffle = Pl_shuffle.objects.get(id=s.id)
shuffle.is_shuffle = not shuffle.is_shuffle
shuffle.save()
else: #adding new item
dayslot_item = DaySlots()
box_item = Boxes()
print(request.POST)
q = 'SELECT id, order_in_slot FROM config_playlist '
q += f"WHERE box_id='{request.POST['box']}' AND day_slot_id='{request.POST['dayslot']}'"
q += f" AND monitor_num='{request.POST['monitor_num']}' ORDER BY order_in_slot DESC LIMIT 1"
last_in_slot_set = Playlist.objects.raw(q)
last_in_slot = 0
print(last_in_slot_set)
for l in last_in_slot_set:
# print('l.order_in_slot = {}, type = {}'.format(l.order_in_slot, type(l.order_in_slot)))
last_in_slot = l.order_in_slot
dayslot_item.id = request.POST['dayslot']
box_item.id = request.POST['box']
last_in_slot += 1
print(f'last_in_slot = {last_in_slot}')
if last_in_slot == 1: # no media in playlist
shuffle_item = Pl_shuffle()
shuffle_item.day_slot = dayslot_item
shuffle_item.box = box_item
shuffle_item.monitor_num = request.POST['monitor_num']
shuffle_item.is_shuffle = False
shuffle_item.save()
media_list = request.POST.getlist('media')
for i in range(len(media_list)):
playlist_item = Playlist()
playlist_item.day_slot = dayslot_item
playlist_item.box = box_item
playlist_item.monitor_num = request.POST['monitor_num']
playlist_item.order_in_slot = last_in_slot + i
playlist_item.media = media_list[i]
playlist_item.play_duration = request.POST['play_duration']
playlist_item.save()
last_add['dayslot'] = int(request.POST['dayslot'])
last_add['box'] = int(request.POST['box'])
last_add['monitor_num'] = request.POST['monitor_num']
last_add['media'] = media_list
last_add['play_duration'] = request.POST['play_duration']
subprocess.run(['cp', '/home/pi/tvnet/db.sqlite3', '/home/pi/tvnet/media/'])
media = os.listdir('media/')
media = sorted(set(media) - {'db.sqlite3', 'listdir'})
dayslots = DaySlots.objects.order_by('start_time')
boxes = Boxes.objects.order_by('box_name')
query = 'SELECT * FROM config_playlist AS pl ' + \
'JOIN config_dayslots AS ds ON pl.day_slot_id=ds.id ' + \
'JOIN config_boxes AS bx ON pl.box_id=bx.id ' + \
'JOIN config_pl_shuffle as sh ON pl.day_slot_id=sh.day_slot_id AND pl.box_id=sh.box_id AND pl.monitor_num=sh.monitor_num ' + \
'ORDER BY start_time, end_time, box_name, monitor_num, order_in_slot'
playlistslots = Playlist.objects.raw(query)
master_ip = get_master_ip()
context = {
'master_ip': master_ip,
'last_add': last_add,
'media': media,
'dayslots': dayslots,
'boxes' : boxes,
'playlistslots': playlistslots,
}
# print(f"time = {time.time() - start_time}")
return HttpResponse(template.render(context, request))