from django import forms
from django.contrib import admin
# Register your models here.
from django.contrib.auth.models import User as django_user
from django.db.models import Value, Subquery, DateTimeField, OuterRef
from django.db.models.functions import Coalesce
from django.urls import reverse_lazy
from django.utils import timezone
from django.utils.safestring import mark_safe

from accounts.models import FifaAccount, FifaAccountBackupCode, PlayerCard, FifaProxy, ChangePositionCard, Console, \
    ConsoleSpecialNames, CloseWebAppTransfers, MuleAccounts, ProgramVersion, CloseWebAppSnipes, PC, \
    AccountSalablePlayerCard, FifaAccountRequest, VerifiedIp, SniperPlayerCard, \
    FifaAccountSearch, ItemPack, FifaAccountDisable, InvestorOperators, FifaAccountSuspend, StartCloseWebAppSnipes, \
    FifaAccountCreditLog, CaptchaSolverLog, ConsoleBotSetting, AccountPackData, ObjectiveSeasonProgressSpecialOption, \
    FifaAccountCurrentItems, NewOutlookAccount, NewConsoleAccount, FifaAccountWorkError, TelegramMessage, \
    AccountBoughtItem, AccountSoldItem, OutlookCreateWorker, OutlookCreateProcess, ConsoleLastStatus, \
    ConsolePowerCommand, PCPowerCommand, FifaAccountInformation, AccountLoginLog, HourlyAccountLoginLogHistory, \
    ConsoleLastStatusHistory, ConsoleWorkTime, ConsoleReadingAccounts, HourlyFifaAccountCreditLogHistory, ElectricNode, \
    ArduinoPort
from squad_battle.models import FifaAccountSquadGame
from sbc.models import SBCWorker


class FifaAccountAdmin(admin.ModelAdmin):
    list_display = ['creator', 'user_name', 'last_run_time', 'active', 'platform', 'name_gamer']
    list_filter = ['active', 'driver']
    search_fields = ['user_name__icontains']
    autocomplete_fields = ['console', 'pc']
    actions = ['make_deactivate', 'make_active', 'make_deactivate_driver',
               'make_activate_squad_battle', 'make_deactivate_squad_battle',
               'make_activate_discharge', 'make_deactivate_discharge',
               ]
    readonly_fields = ('previous_console', 'last_search_update', 'server', 'main_squad_rate')

    @admin.action(description='Deactivate selected fifa accounts')
    def make_deactivate(self, request, queryset):
        queryset.update(active=False)

    @admin.action(description='Active selected fifa accounts')
    def make_active(self, request, queryset):
        queryset.update(active=True)

    @admin.action(description='Deactivate driver')
    def make_deactivate_driver(self, request, queryset):
        queryset.update(driver=False)

    @admin.action(description='Activate selected squad battle')
    def make_activate_squad_battle(self, request, queryset):
        queryset.update(run_squad_battle=True)

    @admin.action(description='Deactivate selected squad battle')
    def make_deactivate_squad_battle(self, request, queryset):
        queryset.update(run_squad_battle=False)

    @admin.action(description='Activate selected discharge')
    def make_activate_discharge(self, request, queryset):
        queryset.update(run_discharge=True)

    @admin.action(description='Deactivate selected discharge')
    def make_deactivate_discharge(self, request, queryset):
        queryset.update(run_discharge=False)

    def name_gamer(self, obj):
        return f'{obj.name_in_console or ""} - {obj.gamer_tag or ""}'


class FifaAccountBackupCodeAdmin(admin.ModelAdmin):
    search_fields = ['fifa_account__user_name']
    autocomplete_fields = ['fifa_account']
    list_display = ['fifa_account', 'backup_code', 'app_code']


class FifaProxyAdmin(admin.ModelAdmin):
    list_display = ['ip_address', 'port', 'user_name']
    search_fields = ['ip_address__contains']


class PlayerCardAdmin(admin.ModelAdmin):
    list_display = ['asset_id', 'rating', 'price', 'update_time', 'trade_last_bid_time']
    search_fields = ['asset_id__contains', 'resource_id__icontains']
    list_filter = ['use_on_trade', 'trade_is_working']


class ChangePositionCardAdmin(admin.ModelAdmin):
    list_display = ['source', 'destination', 'price']


class ConsoleAdmin(admin.ModelAdmin):
    list_display = ['name', 'is_active', 'investor']
    search_fields = ['name__iexact']
    list_filter = ['is_active']
    autocomplete_fields = ['key_fifa_account']
    actions = ['active_accounts_console_invest_trade', 'deactive_accounts_console_invest_trade']

    @admin.action(description='Active Accounts Invest_Trade')
    def active_accounts_console_invest_trade(self, request, queryset):
        for item in queryset:
            item.fifaaccount_set.all().update(
                run_console_invest_trade_one=True
            )

    @admin.action(description='DeActive Accounts Invest_Trade')
    def deactive_accounts_console_invest_trade(self, request, queryset):
        for item in queryset:
            item.fifaaccount_set.all().update(
                run_console_invest_trade_one=False
            )


class ConsolePowerCommandAdmin(admin.ModelAdmin):
    list_display = ['console', 'arduino_pc', 'arduino_port', 'command_status', 'update_time']
    search_fields = ['console__name__iexact']
    autocomplete_fields = ['console', 'arduino_pc']


class PCPowerCommandAdmin(admin.ModelAdmin):
    list_display = ['pc']
    search_fields = ['pc__name__iexact']


class ElectricNodeAdmin(admin.ModelAdmin):
    list_display = ['name', 'pc', 'start_hour', 'end_hour']
    search_fields = ['name__iexact']
    autocomplete_fields = ['pc']


class ConsoleLastStatusAdmin(admin.ModelAdmin):
    list_display = ['console', 'status', 'status_change_time', 'fifa_account']
    search_fields = ['console__name__iexact', 'fifa_account__user_name__icontains']
    autocomplete_fields = ['sbc_worker', 'fifa_account', 'console']


class ConsoleSpecialNamesAdmin(admin.ModelAdmin):
    list_display = ['player_name', 'player_rating', 'edited_name', 'compare_name', 'last_time', 'account_log']
    autocomplete_fields = ['last_fifa_account']
    search_fields = ['player_name__icontains', 'edited_name__icontains']

    def account_log(self, obj):
        if obj.last_fifa_account:
            return mark_safe('<a href="' + str(reverse_lazy(
                'fifa-account-log', kwargs={'pk': obj.last_fifa_account.id})
            )+f'?des_contains=player+data2&submit=Search'+'">log</a>')
        return '--'


class CloseWebAppTransfersAdmin(admin.ModelAdmin):
    list_display = ['player_name', 'start_price', 'buy_now_price', 'for_inject', 'for_discharge', 'error',
                    'first_side_done', 'second_side_done', 'web_app_is_on_it']
    autocomplete_fields = ['first_account', 'second_account']


class MuleAccountsAdmin(admin.ModelAdmin):
    search_fields = ['fifa_account__user_name']
    list_display = ['fifa_account', 'last_used', 'error', 'error_description', 'in_use']
    autocomplete_fields = ['fifa_account']
    actions = ['remove_errors', 'in_use_false']
    list_filter = ['deleted']

    @admin.action(description='Remove error from selected mule accounts')
    def remove_errors(self, request, queryset):
        for item in queryset:
            SBCWorker.objects.filter(
                running_platform='inject', fifa_account=item.fifa_account
            ).update(
                has_error=False, error_description=''
            )
        queryset.update(error=False, error_description='')

    @admin.action(description='make in_use False for selected mule accounts')
    def in_use_false(self, request, queryset):
        queryset.update(in_use=False)


class ProgramVersionAdmin(admin.ModelAdmin):
    list_display = ['number', 'need_to_put_on_rest_mode', 'need_to_close_python_program',
                    'need_to_open_python_program', 'need_to_reset_gamepad']


class CloseWebAppSnipesAdmin(admin.ModelAdmin):
    list_display = ['player_name', 'player_price', 'player_min_price_from_futbin', 'insert_time', 'first_side_ready',
                    'second_side_ready', 'error', 'error_desc', 'web_app_is_on_it', 'first_side_done',
                    'second_side_done', 'winner_account_data']
    autocomplete_fields = ['first_account', 'winner_account']
    search_fields = ['first_account__user_name', 'id']


class StartCloseWebAppSnipesAdmin(admin.ModelAdmin):
    search_fields = ['fifa_account__user_name__iexact']
    list_display = ['create_time', 'fifa_account']
    autocomplete_fields = ['fifa_account']


class PCAdmin(admin.ModelAdmin):
    list_display = ['name', 'any_desk_code']
    search_fields = ['name__icontains']


class AccountSalablePlayerCardAdmin(admin.ModelAdmin):
    search_fields = ['fifa_account__user_name__icontains']
    list_display = ['fifa_account', 'player_card', 'buy_start_price']
    autocomplete_fields = ['fifa_account', 'player_card']


class FifaAccountRequestAdmin(admin.ModelAdmin):
    search_fields = ['fifa_account__user_name__icontains']
    list_display = ['fifa_account', 'create_time', 'link']
    autocomplete_fields = ['fifa_account']

    def get_queryset(self, request):
        return super().get_queryset(request).using('logs')

    def save_model(self, request, obj, form, change):
        obj.save(using='logs')

    def delete_model(self, request, obj):
        obj.delete(using='logs')

    def get_search_results(self, request, queryset, search_term):
        queryset, use_distinct = super().get_search_results(request, queryset, search_term)
        return queryset.using('logs'), use_distinct


class VerifiedIpAdmin(admin.ModelAdmin):
    list_display = ['ip_address']


class SniperPlayerCardAdmin(admin.ModelAdmin):
    list_display = ['player_card', 'min_price', 'buy_now_price', 'use_console_discharge']
    autocomplete_fields = ['player_card']
    search_fields = ['player_card']


class FifaAccountSearchAdmin(admin.ModelAdmin):
    search_fields = ['fifa_account__user_name']
    list_display = ['fifa_account', 'search_time']
    autocomplete_fields = ['fifa_account']


class ItemPackAdmin(admin.ModelAdmin):
    search_fields = ['fifa_account__user_name', 'pack_id']
    list_display = ['fifa_account', 'pack_id', 'open_price', 'pack_value']
    autocomplete_fields = ['fifa_account']


class FifaAccountDisableAdmin(admin.ModelAdmin):
    search_fields = ['console__name__iexact', 'fifa_account__user_name__iexact']
    list_display = ['fifa_account', 'create_time_', 'console', 'last_run_time_', 'first_played_game',
                    'games_all', 'games_31', 'games_7', 'games_24h', 'last_worker_time', 'last_play_time',
                    'disable_mode']
    autocomplete_fields = ['fifa_account']
    list_filter = ['disable_mode']

    def get_queryset(self, request):
        query = super().get_queryset(request)
        query = query.annotate(last_play_time=Coalesce(Subquery(
            FifaAccountSquadGame.objects.filter(
                fifa_account__id=OuterRef('fifa_account__id')
            ).values('create_time')[:1],
            output_field=DateTimeField()
        ), Value(None)))
        return query

    def create_time_(self, obj):
        if obj.create_time:
            return timezone.localtime(obj.create_time).strftime('%Y/%m/%d %H:%M')

    def last_run_time_(self, obj):
        if obj.last_run_time:
            return timezone.localtime(obj.last_run_time).strftime('%Y/%m/%d %H:%M')

    def first_played_game(self, obj):
        first_item = FifaAccountSquadGame.objects.filter(fifa_account=obj.fifa_account).order_by('create_time').first()
        if first_item:
            return timezone.localtime(first_item.create_time).strftime('%Y/%m/%d %H:%M')

    def games_all(self, obj):
        played = FifaAccountSquadGame.objects.filter(fifa_account=obj.fifa_account)
        return played.count()

    def games_31(self, obj):
        # last_play = FifaAccountSquadGame.objects.filter(fifa_account=obj.fifa_account).last()
        last_play_time = obj.last_play_time
        if last_play_time:
            played = FifaAccountSquadGame.objects.filter(
                fifa_account=obj.fifa_account,
                create_time__gt=last_play_time - timezone.timedelta(days=31)
            )
            return played.count()
        return '-'

    def games_7(self, obj):
        # last_play = FifaAccountSquadGame.objects.filter(fifa_account=obj.fifa_account).last()
        last_play_time = obj.last_play_time
        if last_play_time:
            played = FifaAccountSquadGame.objects.filter(
                fifa_account=obj.fifa_account,
                create_time__gt=last_play_time - timezone.timedelta(days=7)
            )
            return played.count()
        return '-'

    def games_24h(self, obj):
        # last_play = FifaAccountSquadGame.objects.filter(fifa_account=obj.fifa_account).last()
        last_play_time = obj.last_play_time
        if last_play_time:
            played = FifaAccountSquadGame.objects.filter(
                fifa_account=obj.fifa_account,
                create_time__gt=last_play_time - timezone.timedelta(hours=24)
            )
            return played.count()
        return '-'

    def last_worker_time(self, obj):
        last_worker = SBCWorker.objects.filter(fifa_account=obj.fifa_account, is_done=True).last()
        if last_worker:
            return timezone.localtime(last_worker.end_time).strftime('%Y/%m/%d %H:%M')
        else:
            return '---'

    def last_play_time(self, obj):
        # last_play = FifaAccountSquadGame.objects.filter(fifa_account=obj.fifa_account).last()
        last_play_time = obj.last_play_time
        if last_play_time:
            return timezone.localtime(last_play_time).strftime('%Y/%m/%d %H:%M')
        else:
            return '---'


class FifaAccountSuspendAdmin(admin.ModelAdmin):
    search_fields = ['console__name__iexact', 'fifa_account__user_name__iexact']
    list_display = ['fifa_account', 'create_time_', 'console', 'last_run_time_', 'last_worker_time', 'last_play_time']
    autocomplete_fields = ['fifa_account']

    def create_time_(self, obj):
        if obj.create_time:
            return timezone.localtime(obj.create_time).strftime('%Y/%m/%d %H:%M')

    def last_run_time_(self, obj):
        if obj.last_run_time:
            return timezone.localtime(obj.last_run_time).strftime('%Y/%m/%d %H:%M')

    def last_worker_time(self, obj):
        last_worker = SBCWorker.objects.filter(fifa_account=obj.fifa_account, is_done=True).last()
        if last_worker:
            return timezone.localtime(last_worker.end_time).strftime('%Y/%m/%d %H:%M')
        else:
            return '---'

    def last_play_time(self, obj):
        last_play = FifaAccountSquadGame.objects.filter(fifa_account=obj.fifa_account).last()
        if last_play:
            return timezone.localtime(last_play.create_time).strftime('%Y/%m/%d %H:%M')
        else:
            return '---'


class InvestorOperatorsFormAdmin(forms.ModelForm):
    investor = forms.ModelChoiceField(queryset=django_user.objects.filter(user_permissions__codename='is_investor'))
    operators = forms.ModelMultipleChoiceField(
        queryset=django_user.objects.filter(user_permissions__codename='is_operator')
    )

    class Meta:
        model = InvestorOperators
        exclude = []


class InvestorOperatorsAdmin(admin.ModelAdmin):
    list_display = ['investor', 'operators_list']
    form = InvestorOperatorsFormAdmin

    def operators_list(self, obj):
        return " -".join([p.username for p in obj.operators.all()])


class FifaAccountCreditLogAdmin(admin.ModelAdmin):
    list_display = ['fifa_account', 'console', 'create_time', 'current_credit', 'today_production', 'save_credit_try']
    search_fields = ['fifa_account__console__name__iexact', 'fifa_account__user_name__iexact']
    autocomplete_fields = ['fifa_account', 'today_discharges', 'today_discharges_mode2', 'today_console_trades_history']

    def console(self, obj):
        if obj.fifa_account.console:
            return obj.fifa_account.console.name
        return '-'


class CaptchaSolverLogAdmin(admin.ModelAdmin):
    list_display = ['create_time', 'fifa_account', 'solve_status', 'captcha_solver_name']
    autocomplete_fields = ['fifa_account']
    search_fields = ['fifa_account__user_name__iexact']


class ConsoleBotSettingAdmin(admin.ModelAdmin):
    list_display = ['create_time', 'name', 'str_value', 'int_value']
    autocomplete_fields = ['creator']


class AccountPackDataAdmin(admin.ModelAdmin):
    list_display = ['create_time', 'fifa_account', 'pack_id', 'untradeable']
    autocomplete_fields = ['fifa_account']
    search_fields = ['fifa_account__user_name__iexact']


class ObjectiveSeasonProgressSpecialOptionAdmin(admin.ModelAdmin):
    list_display = ['create_time', 'title', 'xp_threshold', 'option_id']


class FifaAccountCurrentItemsAdmin(admin.ModelAdmin):
    list_display = ['create_time', 'fifa_account', 'update_time', 'unassigned_item_count']
    autocomplete_fields = ['fifa_account']
    search_fields = ['fifa_account__user_name__iexact']


class FifaAccountInformationAdmin(admin.ModelAdmin):
    list_display = ['create_time', 'fifa_account']
    autocomplete_fields = ['fifa_account']
    search_fields = ['fifa_account__user_name__iexact']


class NewOutlookAccountAdmin(admin.ModelAdmin):
    list_display = ['create_time', 'user_name', 'console', 'signup_status', 'last_create_status',
                    'start_signup_time', 'browser']
    autocomplete_fields = ['console', 'proxy']
    search_fields = ['user_name__iexact', 'console__name__iexact']
    list_filter = ['signup_status']


class OutlookCreateWorkerAdmin(admin.ModelAdmin):
    list_display = ['create_time', 'outlook_name', 'has_error', 'is_done']
    autocomplete_fields = ['outlook_account']
    search_fields = ['outlook_account__user_name__icontains', 'outlook_account__console__name__iexact']
    list_filter = ['is_done', 'has_error']

    def outlook_name(self, obj):
        if obj.outlook_account:
            return str(obj.outlook_account.user_name)
        return ''


class NewConsoleAccountAdmin(admin.ModelAdmin):
    list_display = ['create_time', 'user_name', 'console', 'add_status', 'gamer_tag']
    autocomplete_fields = ['console']
    search_fields = ['user_name__iexact', 'console__name__iexact']


class FifaAccountWorkErrorAdmin(admin.ModelAdmin):
    list_display = ['create_time', 'fifa_account', 'error_text', 'solve_status', 'solve_time', 'solve_user']
    search_fields = ['fifa_account__user_name__iexact', 'fifa_account__console__name__iexact']
    autocomplete_fields = ['fifa_account']
    list_filter = ['solve_status', 'error_text']


class TelegramMessageAdmin(admin.ModelAdmin):
    list_display = ['create_time', 'fifa_account', 'short_text']
    search_fields = ['fifa_account__user_name__iexact', 'fifa_account__console__name__iexact', 'text__icontains']
    autocomplete_fields = ['fifa_account']
    list_filter = ['message_type']

    def short_text(self, obj):
        if obj.text:
            return obj.text[:100]
        return '--'


class AccountBoughtItemAdmin(admin.ModelAdmin):
    list_display = ['create_time', 'fifa_account', 'buy_price', 'item_type', 'requested_worker']
    search_fields = ['fifa_account__user_name__iexact', 'fifa_account__console__name__iexact']
    autocomplete_fields = ['fifa_account']
    list_filter = ['item_type']


class AccountSoldItemAdmin(admin.ModelAdmin):
    list_display = ['create_time', 'fifa_account', 'item_type', 'buy_price', 'sell_price', 'asset_id']
    search_fields = ['fifa_account__user_name__icontains', 'fifa_account__console__name__iexact']
    autocomplete_fields = ['fifa_account']


class OutlookCreateProcessAdmin(admin.ModelAdmin):
    list_display = ['create_time', 'outlook_account', 'is_done', 'status']
    search_fields = ['outlook_account__user_name__icontains', 'outlook_account__console__name__iexact']
    autocomplete_fields = ['outlook_account']


class ConsoleLastStatusHistoryAdmin(admin.ModelAdmin):
    list_display = ['create_time', 'console', 'status']


class AccountLoginLogAdmin(admin.ModelAdmin):
    list_display = ['fifa_account', 'login_method', 'login_status']
    autocomplete_fields = ['fifa_account']


class HourlyAccountLoginLogHistoryAdmin(admin.ModelAdmin):
    list_display = ['login_with_requests_count', 'login_with_selenium_count', 'get_new_access_token_count']


class ConsoleWorkTimeAdmin(admin.ModelAdmin):
    search_fields = ['console__name__iexact']
    list_display = ['console', 'start_time', 'end_time']
    autocomplete_fields = ['console']
    list_filter = ['start_time']


class HourlyFifaAccountCreditLogHistoryAdmin(admin.ModelAdmin):
    list_display = ['create_time', 'current_credit', 'today_production']


class ConsoleReadingAccountsAdmin(admin.ModelAdmin):
    search_fields = ['console__name__iexact']
    list_display = ['create_time', 'console', 'status_code']
    autocomplete_fields = ['console']
    list_filter = ['status_code']


class ArduinoPortAdmin(admin.ModelAdmin):
    list_display = ['board_name', 'port_name', 'pin_name', 'current_state', 'electric_node', 'auto_update', 'last_get_state_time']
    search_fields = ['port_name__iexact']
    autocomplete_fields = ['electric_node']
    list_filter = ['board_name', 'auto_update']


admin.site.register(FifaAccount, FifaAccountAdmin)
admin.site.register(FifaAccountBackupCode, FifaAccountBackupCodeAdmin)
admin.site.register(FifaProxy, FifaProxyAdmin)
admin.site.register(PlayerCard, PlayerCardAdmin)
admin.site.register(ChangePositionCard, ChangePositionCardAdmin)
admin.site.register(Console, ConsoleAdmin)
admin.site.register(ConsolePowerCommand, ConsolePowerCommandAdmin)
admin.site.register(ConsoleLastStatus, ConsoleLastStatusAdmin)
admin.site.register(ConsoleSpecialNames, ConsoleSpecialNamesAdmin)
admin.site.register(CloseWebAppTransfers, CloseWebAppTransfersAdmin)
admin.site.register(MuleAccounts, MuleAccountsAdmin)
admin.site.register(ProgramVersion, ProgramVersionAdmin)
admin.site.register(CloseWebAppSnipes, CloseWebAppSnipesAdmin)
admin.site.register(PC, PCAdmin)
admin.site.register(PCPowerCommand, PCPowerCommandAdmin)
admin.site.register(ElectricNode, ElectricNodeAdmin)
admin.site.register(AccountSalablePlayerCard, AccountSalablePlayerCardAdmin)
admin.site.register(FifaAccountRequest, FifaAccountRequestAdmin)
admin.site.register(VerifiedIp, VerifiedIpAdmin)
admin.site.register(SniperPlayerCard, SniperPlayerCardAdmin)
admin.site.register(FifaAccountSearch, FifaAccountSearchAdmin)
admin.site.register(ItemPack, ItemPackAdmin)
admin.site.register(FifaAccountDisable, FifaAccountDisableAdmin)
admin.site.register(FifaAccountSuspend, FifaAccountSuspendAdmin)
admin.site.register(InvestorOperators, InvestorOperatorsAdmin)
admin.site.register(StartCloseWebAppSnipes, StartCloseWebAppSnipesAdmin)
admin.site.register(FifaAccountCreditLog, FifaAccountCreditLogAdmin)
admin.site.register(CaptchaSolverLog, CaptchaSolverLogAdmin)
admin.site.register(ConsoleBotSetting, ConsoleBotSettingAdmin)
admin.site.register(AccountPackData, AccountPackDataAdmin)
admin.site.register(ObjectiveSeasonProgressSpecialOption, ObjectiveSeasonProgressSpecialOptionAdmin)
admin.site.register(FifaAccountCurrentItems, FifaAccountCurrentItemsAdmin)
admin.site.register(FifaAccountInformation, FifaAccountInformationAdmin)
admin.site.register(NewOutlookAccount, NewOutlookAccountAdmin)
admin.site.register(OutlookCreateWorker, OutlookCreateWorkerAdmin)
admin.site.register(NewConsoleAccount, NewConsoleAccountAdmin)
admin.site.register(FifaAccountWorkError, FifaAccountWorkErrorAdmin)
admin.site.register(TelegramMessage, TelegramMessageAdmin)
admin.site.register(AccountBoughtItem, AccountBoughtItemAdmin)
admin.site.register(AccountSoldItem, AccountSoldItemAdmin)
admin.site.register(OutlookCreateProcess, OutlookCreateProcessAdmin)
admin.site.register(ConsoleLastStatusHistory, ConsoleLastStatusHistoryAdmin)
admin.site.register(AccountLoginLog, AccountLoginLogAdmin)
admin.site.register(HourlyAccountLoginLogHistory, HourlyAccountLoginLogHistoryAdmin)
admin.site.register(ConsoleWorkTime, ConsoleWorkTimeAdmin)
admin.site.register(HourlyFifaAccountCreditLogHistory, HourlyFifaAccountCreditLogHistoryAdmin)
admin.site.register(ConsoleReadingAccounts, ConsoleReadingAccountsAdmin)
admin.site.register(ArduinoPort, ArduinoPortAdmin)

