Example #1
0
def group_leave_reject_request(request, group_request_id):
    logger.debug(
        "group_leave_reject_request called by user %s for group request id %s" % (request.user, group_request_id))
    group_request = get_object_or_404(GroupRequest, id=group_request_id)
    try:
        if not GroupManager.can_manage_group(request.user, group_request.group):
            raise PermissionDenied

        if group_request:
            group_request.delete()
            logger.info("User %s rejected group leave request from user %s for group %s" % (
                request.user, group_request.user, group_request.group.name))
            notify(group_request.user, "Group Leave Request Rejected", level="danger",
                   message="Your request to leave %s has been rejected." % group_request.group)
            messages.success(request, _('Rejected application from %(mainchar)s to leave %(group)s.') % {
                "mainchar": group_request.main_char, "group": group_request.group})
    except PermissionDenied as p:
        logger.warning("User %s attempted to reject group leave request %s but permission was denied" %
                       (request.user, group_request_id))
        raise p
    except:
        messages.error(request, _('An unhandled error occured while processing the application from %(mainchar)s to leave %(group)s.') % {
            "mainchar": group_request.main_char, "group": group_request.group})
        logger.exception("Unhandled exception occured while user %s attempting to reject group leave request id %s" % (
            request.user, group_request_id))
        pass

    return redirect("groupmanagement:management")
Example #2
0
def group_accept_request(request, group_request_id):
    logger.debug("group_accept_request called by user %s for grouprequest id %s" % (request.user, group_request_id))
    group_request = get_object_or_404(GroupRequest, id=group_request_id)
    try:
        group, created = Group.objects.get_or_create(name=group_request.group.name)

        if not GroupManager.joinable_group(group_request.group) or \
                not GroupManager.can_manage_group(request.user, group_request.group):
            raise PermissionDenied

        group_request.user.groups.add(group)
        group_request.user.save()
        group_request.delete()
        logger.info("User %s accepted group request from user %s to group %s" % (
            request.user, group_request.user, group_request.group.name))
        notify(group_request.user, "Group Application Accepted", level="success",
               message="Your application to %s has been accepted." % group_request.group)
        messages.success(request,
                         _('Accepted application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group})

    except PermissionDenied as p:
        logger.warning("User %s attempted to accept group join request %s but permission was denied" %
                       (request.user, group_request_id))
        raise p
    except:
        messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group})
        logger.exception("Unhandled exception occurred while user %s attempting to accept grouprequest id %s." % (
            request.user, group_request_id))
        pass

    return redirect("groupmanagement:management")
Example #3
0
def srp_request_reject(request):
    numrequests = len(request.POST) - 1
    logger.debug("srp_request_reject called by user %s for %s srp request id's" % (request.user, numrequests))
    stored_fleet_view = None
    for srp_request_id in request.POST:
        if numrequests == 0:
            messages.warning(request, _("No SRP requests selected"))
            return redirect("srp:management")
        if srp_request_id == "csrfmiddlewaretoken":
            continue
        if SrpUserRequest.objects.filter(id=srp_request_id).exists():
            srpuserrequest = SrpUserRequest.objects.get(id=srp_request_id)
            stored_fleet_view = srpuserrequest.srp_fleet_main.id
            srpuserrequest.srp_status = "Rejected"
            srpuserrequest.save()
            logger.info("SRP request id %s for character %s rejected by %s" % (
                srp_request_id, srpuserrequest.character, request.user))
            notify(
                srpuserrequest.character.character_ownership.user,
                'SRP Request Rejected',
                level='danger',
                message='Your SRP request for a %s lost during %s has been rejected.' % (
                    srpuserrequest.srp_ship_name, srpuserrequest.srp_fleet_main.fleet_name)
            )
    if stored_fleet_view is None:
        logger.error("Unable to reject SRP request on behalf of user %s - request matching id not found." % (request.user))
        messages.error(request, _('Unable to locate selected SRP request'))
        return redirect("srp:management")
    else:
        messages.success(request, _('Rejected %(numrequests)s SRP requests.') % {"numrequests": numrequests})
        return redirect("srp:fleet", stored_fleet_view)
Example #4
0
 def delete_user(cls, user, notify_user=False):
     if cls.has_account(user) and SeatManager.disable_user(user.seat.username):
         user.seat.delete()
         logger.info("Successfully deactivated SeAT for user %s" % user)
         if notify_user:
             notify(user, 'SeAT Account Disabled', level='danger')
         return True
     return False
Example #5
0
 def delete_user(cls, user, notify_user=False):
     if cls.has_account(user) and user.discourse.enabled:
         logger.debug("User %s has a Discourse account. Disabling login." % user)
         if DiscourseManager.disable_user(user):
             user.discourse.delete()
             if notify_user:
                 notify(user, 'Discourse Account Disabled', level='danger')
             return True
     return False
Example #6
0
 def delete_user(cls, user, notify_user=False):
     if cls.has_account(user) and user.discourse.enabled:
         logger.debug("User %s has a Discourse account. Disabling login." % user)
         if DiscourseManager.disable_user(user):
             user.discourse.delete()
             if notify_user:
                 notify(user, 'Discourse Account Disabled', level='danger')
             return True
     return False
Example #7
0
 def delete_user(cls, user, notify_user=False):
     if cls.has_account(user):
         logger.debug("User %s has discord account %s. Deleting." % (user, user.discord.uid))
         if DiscordOAuthManager.delete_user(user.discord.uid):
             user.discord.delete()
             if notify_user:
                 notify(user, 'Discord Account Disabled', level='danger')
             return True
     return False
Example #8
0
 def delete_user(cls, user, notify_user=False):
     if cls.has_account(user):
         logger.debug("User %s has a XenForo account %s. Deleting." % (user, user.xenforo.username))
         if XenForoManager.disable_user(user.xenforo.username) == 200:
             user.xenforo.delete()
             if notify_user:
                 notify(user, 'XenForo Account Disabled', level='danger')
             return True
     return False
Example #9
0
 def delete_user(cls, user, notify_user=False):
     if cls.has_account(user):
         logger.debug("User %s has forum account %s. Deleting." % (user, user.phpbb3.username))
         if Phpbb3Manager.disable_user(user.phpbb3.username):
             user.phpbb3.delete()
             if notify_user:
                 notify(user, 'Forum Account Disabled', level='danger')
             return True
     return False
Example #10
0
 def delete_user(cls, user, notify_user=False):
     if cls.has_account(user):
         logger.debug("User %s has a Market account %s. Deleting." % (user, user.market.username))
         if MarketManager.disable_user(user.market.username):
             user.market.delete()
             if notify_user:
                 notify(user, 'Alliance Market Account Disabled', level='danger')
             return True
     return False
Example #11
0
 def delete_user(cls, user, notify_user=False):
     if cls.has_account(user):
         logger.debug("User %s has a SMF account %s. Deleting." % (user, user.smf.username))
         SmfManager.disable_user(user.smf.username)
         user.smf.delete()
         if notify_user:
             notify(user, "SMF Account Disabled", level='danger')
         return True
     return False
Example #12
0
 def delete_user(self, user, notify_user=False):
     logging.debug("Deleting user %s %s account" % (user, self.name))
     try:
         if user.mumble.delete():
             if notify_user:
                 notify(user, 'Mumble Account Disabled', level='danger')
             return True
         return False
     except MumbleUser.DoesNotExist:
         logging.debug("User does not have a mumble account")
Example #13
0
 def delete_user(cls, user, notify_user=False):
     if cls.has_account(user):
         logger.debug("User %s has TS3 account %s. Deleting." % (user, user.teamspeak3.uid))
         with Teamspeak3Manager() as ts3man:
             if ts3man.delete_user(user.teamspeak3.uid):
                 user.teamspeak3.delete()
                 if notify_user:
                     notify(user, 'TeamSpeak3 Account Disabled', level='danger')
                 return True
     return False
Example #14
0
 def delete_user(cls, user, notify_user=False):
     if cls.has_account(user):
         logger.debug("User %s has a XenForo account %s. Deleting." %
                      (user, user.xenforo.username))
         if XenForoManager.disable_user(user.xenforo.username) == 200:
             user.xenforo.delete()
             if notify_user:
                 notify(user, 'XenForo Account Disabled', level='danger')
             return True
     return False
Example #15
0
 def delete_user(cls, user, notify_user=False):
     if cls.has_account(user):
         logger.debug("User %s has discord account %s. Deleting." %
                      (user, user.discord.uid))
         if DiscordOAuthManager.delete_user(user.discord.uid):
             user.discord.delete()
             if notify_user:
                 notify(user, 'Discord Account Disabled', level='danger')
             return True
     return False
Example #16
0
def hr_application_remove(request, app_id):
    logger.debug("hr_application_remove called by user %s for app id %s" %
                 (request.user, app_id))
    app = get_object_or_404(Application, pk=app_id)
    logger.info("User %s deleting %s" % (request.user, app))
    app.delete()
    notify(app.user,
           "Application Deleted",
           message="Your application to %s was deleted." % app.form.corp)
    return redirect('hrapplications:index')
Example #17
0
 def delete_user(self, user, notify_user=False):
     logging.debug("Deleting user %s %s account" % (user, self.name))
     try:
         if user.mumble.delete():
             if notify_user:
                 notify(user, 'Mumble Account Disabled', level='danger')
             return True
         return False
     except MumbleUser.DoesNotExist:
         logging.debug("User does not have a mumble account")
Example #18
0
 def delete_user(cls, user, notify_user=False):
     if cls.has_account(user):
         logger.debug("User %s has jabber account %s. Deleting." %
                      (user, user.openfire.username))
         OpenfireManager.delete_user(user.openfire.username)
         user.openfire.delete()
         if notify_user:
             notify(user, 'Jabber Account Disabled', level='danger')
         return True
     return False
Example #19
0
 def delete_user(cls, user, notify_user=False):
     if cls.has_account(user):
         logger.debug("User %s has a SMF account %s. Deleting." %
                      (user, user.smf.username))
         SmfManager.disable_user(user.smf.username)
         user.smf.delete()
         if notify_user:
             notify(user, "SMF Account Disabled", level='danger')
         return True
     return False
Example #20
0
def group_leave_accept_request(request, group_request_id):
    logger.debug(
        "group_leave_accept_request called by user %s for group request id %s"
        % (request.user, group_request_id))
    group_request = get_object_or_404(GroupRequest, id=group_request_id)
    try:
        if not GroupManager.can_manage_group(request.user,
                                             group_request.group):
            raise PermissionDenied

        group, created = Group.objects.get_or_create(
            name=group_request.group.name)
        group_request.user.groups.remove(group)
        group_request.user.save()
        log = RequestLog(request_type=group_request.leave_request,
                         group=group_request.group,
                         request_info=group_request.__str__(),
                         action=1,
                         request_actor=request.user)
        log.save()
        group_request.delete()
        logger.info(
            "User %s accepted group leave request from user %s to group %s" %
            (request.user, group_request.user, group_request.group.name))
        notify(group_request.user,
               "Group Leave Request Accepted",
               level="success",
               message="Your request to leave %s has been accepted." %
               group_request.group)
        messages.success(
            request,
            _('Accepted application from %(mainchar)s to leave %(group)s.') % {
                "mainchar": group_request.main_char,
                "group": group_request.group
            })
    except PermissionDenied as p:
        logger.warning(
            "User %s attempted to accept group leave request %s but permission was denied"
            % (request.user, group_request_id))
        raise p
    except:
        messages.error(
            request,
            _('An unhandled error occured while processing the application from %(mainchar)s to leave %(group)s.'
              ) % {
                  "mainchar": group_request.main_char,
                  "group": group_request.group
              })
        logger.exception(
            "Unhandled exception occured while user %s attempting to accept group leave request id %s"
            % (request.user, group_request_id))
        pass

    return redirect("groupmanagement:management")
Example #21
0
def send_user_notification(user: User, level: str, title: str,
                           message: str) -> None:
    """
    send notification to user
    this creates a notification in Auth and a PM in Discord when either
    AA-Discordbot or AA Discord Notifications are installed
    :param user:
    :param level:
    :param title:
    :param message:
    """

    notify(user=user, title=title, level=level, message=message)

    # Handle Discord PMs when aa_discordnotify is not active
    # Check if either allianceauth_discordbot or discordproxy are available
    # to send the PM
    if not aa_discordnotify_active():
        try:
            # Third Party
            from discordproxy.client import DiscordClient
            from discordproxy.discord_api_pb2 import Embed
            from discordproxy.exceptions import DiscordProxyException
        except ModuleNotFoundError:
            # discordproxy not available, try allianceauth-discordbot
            if allianceauth_discordbot_active():
                # Third Party
                import aadiscordbot.tasks

                aadiscordbot.tasks.send_direct_message_by_user_id.delay(
                    user.pk, message)
        else:
            # discordproxy is available, use it,
            # if the user has a Discord account that is
            if hasattr(user, "discord"):
                client = DiscordClient()

                footer = Embed.Footer(text=__title__)

                embed = Embed(
                    title=str(title),
                    description=message,
                    color=DISCORD_EMBED_COLOR_MAP.get(level, None),
                    timestamp=timezone.now().isoformat(),
                    footer=footer,
                )

                try:
                    client.create_direct_message(user_id=int(user.discord.uid),
                                                 embed=embed)
                except DiscordProxyException:
                    # something went wrong with discordproxy, fail silently
                    pass
Example #22
0
 def assign_state(self, state=None, commit=True):
     if not state:
         state = State.objects.get_for_user(self.user)
     if self.state != state:
         self.state = state
         if commit:
             logger.info('Updating {} state to {}'.format(self.user, self.state))
             self.save(update_fields=['state'])
             notify(self.user, _('State Changed'),
                    _('Your user state has been changed to %(state)s') % ({'state': state}),
                    'info')
             from allianceauth.authentication.signals import state_changed
             state_changed.send(sender=self.__class__, user=self.user, state=self.state)
Example #23
0
def hr_application_reject(request, app_id):
    logger.debug("hr_application_reject called by user %s for app id %s" %
                 (request.user, app_id))
    app = get_object_or_404(Application, pk=app_id)
    if request.user.is_superuser or request.user == app.reviewer:
        logger.info("User %s rejecting %s" % (request.user, app))
        app.approved = False
        app.save()
        notify(app.user,
               "Application Rejected",
               message="Your application to %s has been rejected." %
               app.form.corp,
               level="danger")
    else:
        logger.warn("User %s not authorized to reject %s" %
                    (request.user, app))
    return redirect('hrapplications:index')
Example #24
0
    def process_requests(cls, reqs):
        """
        Process all the Standing requests/revocation objects
        :param reqs: AbstractStandingsRequest list
        :return: None
        """
        for r in reqs:

            sat = r.check_standing_satisfied()

            if sat and r.contactType in PilotStanding.contactTypes:
                pass
                """
                char = EveManager.get_character_by_id(r.contactID)
                if type(r) is StandingsRequest:
                    # Request, send a notification
                    notify(char.user, "Standings Request", message="Your standings request for {0} is now effective"
                                                                " in game".format(char.character_name))
                elif type(r) is StandingsRevocation:
                    # Revocation. Try and send a request (user or character may be deleted)
                    if char is not None:
                        notify(char.user, "Standings Revocation", message="Your standings for {0} have been revoked "
                                                                          "in game".format(char.character_name))
                """
            elif sat:
                pass  # Just catching all other contact types (corps/alliances) that are set effective
            elif not sat and r.effective:
                # Standing is not effective, but has previously been marked as effective.
                # Unset effective
                logger.info(
                    "Standing for {0} is marked as effective but is not satisifed in game. "
                    "Resetting to initial state".format(r.contactID))
                r.reset_to_initial()
            else:
                # Check the standing hasn't been set actioned and not updated in game
                act = r.check_standing_actioned_timeout()
                if act is not None and act:
                    # Notify the actor user
                    notify(act,
                           "Standings Request Action",
                           message="A standings request for contactID {0} you "
                           "actioned has been reset as it did not appear in "
                           "game before the timeout period expired."
                           "".format(r.contactID))
Example #25
0
def srp_request_approve(request):
    numrequests = len(request.POST) - 1
    logger.debug(
        "srp_request_approve called by user %s for %s srp request id's" %
        (request.user, numrequests))
    stored_fleet_view = None
    for srp_request_id in request.POST:
        if numrequests == 0:
            messages.warning(request, _("No SRP requests selected"))
            return redirect("srp:management")
        if srp_request_id == "csrfmiddlewaretoken":
            continue
        if SrpUserRequest.objects.filter(id=srp_request_id).exists():
            srpuserrequest = SrpUserRequest.objects.get(id=srp_request_id)
            stored_fleet_view = srpuserrequest.srp_fleet_main.id
            srpuserrequest.srp_status = "Approved"
            if srpuserrequest.srp_total_amount == 0:
                srpuserrequest.srp_total_amount = srpuserrequest.kb_total_loss
            srpuserrequest.save()
            logger.info(
                "Approved SRP request id %s for character %s by user %s" %
                (srp_request_id, srpuserrequest.character, request.user))
            notify(
                srpuserrequest.character.character_ownership.user,
                'SRP Request Approved',
                level='success',
                message=
                'Your SRP request for a %s lost during %s has been approved for %s ISK.'
                % (srpuserrequest.srp_ship_name,
                   srpuserrequest.srp_fleet_main.fleet_name,
                   intcomma(srpuserrequest.srp_total_amount)))
    if stored_fleet_view is None:
        logger.error(
            "Unable to approve srp request on behalf of user %s - request matching id not found."
            % (request.user))
        messages.error(request, _('Unable to locate selected SRP request.'))
        return redirect("srp:management")
    else:
        messages.success(
            request,
            _('Approved %(numrequests)s SRP requests') %
            {"numrequests": numrequests})
        return redirect("srp:fleet", stored_fleet_view)
Example #26
0
def hr_application_mark_in_progress(request, app_id):
    logger.debug(
        "hr_application_mark_in_progress called by user %s for app id %s" %
        (request.user, app_id))
    app = get_object_or_404(Application, pk=app_id)
    if not app.reviewer:
        logger.info("User %s marking %s in progress" % (request.user, app))
        app.reviewer = request.user
        app.reviewer_character = request.user.profile.main_character
        app.save()
        notify(app.user,
               "Application In Progress",
               message="Your application to %s is being reviewed by %s" %
               (app.form.corp, app.reviewer_str))
    else:
        logger.warn(
            "User %s unable to mark %s in progress: already being reviewed by %s"
            % (request.user, app, app.reviewer))
    return redirect("hrapplications:view", app_id)
Example #27
0
    def update(self):
        try:
            c = self.token.get_esi_client(spec_file=SWAGGER_SPEC_PATH)
            assert c.Character.get_characters_character_id(character_id=self.token.character_id).result()[
                       'corporation_id'] == int(self.corp.corporation_id)
            member_ids = c.Corporation.get_corporations_corporation_id_members(
                corporation_id=self.corp.corporation_id).result()

            # requesting too many ids per call results in a HTTP400
            # the swagger spec doesn't have a maxItems count
            # manual testing says we can do over 350, but let's not risk it
            member_id_chunks = [member_ids[i:i + 255] for i in range(0, len(member_ids), 255)]
            member_name_chunks = [c.Character.get_characters_names(character_ids=id_chunk).result() for id_chunk in
                                  member_id_chunks]
            member_list = {}
            for name_chunk in member_name_chunks:
                member_list.update({m['character_id']: m['character_name'] for m in name_chunk})

            # bulk create new member models
            missing_members = [m_id for m_id in member_ids if
                               not CorpMember.objects.filter(corpstats=self, character_id=m_id).exists()]
            CorpMember.objects.bulk_create(
                [CorpMember(character_id=m_id, character_name=member_list[m_id], corpstats=self) for m_id in
                 missing_members])

            # purge old members
            self.members.exclude(character_id__in=member_ids).delete()

            # update the timer
            self.save()

        except TokenError as e:
            logger.warning("%s failed to update: %s" % (self, e))
            if self.token.user:
                notify(self.token.user, "%s failed to update with your ESI token." % self,
                       message="Your token has expired or is no longer valid. Please add a new one to create a new CorpStats.",
                       level="error")
            self.delete()
        except HTTPForbidden as e:
            logger.warning("%s failed to update: %s" % (self, e))
            if self.token.user:
                notify(self.token.user, "%s failed to update with your ESI token." % self,
                       message="%s: %s" % (e.status_code, e.message), level="error")
            self.delete()
        except AssertionError:
            logger.warning("%s token character no longer in corp." % self)
            if self.token.user:
                notify(self.token.user, "%s cannot update with your ESI token." % self,
                       message="%s cannot update with your ESI token as you have left corp." % self, level="error")
            self.delete()
Example #28
0
    def update(self):
        try:
            c = self.token.get_esi_client(spec_file=SWAGGER_SPEC_PATH)
            assert c.Character.get_characters_character_id(character_id=self.token.character_id).result()[
                       'corporation_id'] == int(self.corp.corporation_id)
            member_ids = c.Corporation.get_corporations_corporation_id_members(
                corporation_id=self.corp.corporation_id).result()

            # requesting too many ids per call results in a HTTP400
            # the swagger spec doesn't have a maxItems count
            # manual testing says we can do over 350, but let's not risk it
            member_id_chunks = [member_ids[i:i + 255] for i in range(0, len(member_ids), 255)]
            member_name_chunks = [c.Character.get_characters_names(character_ids=id_chunk).result() for id_chunk in
                                  member_id_chunks]
            member_list = {}
            for name_chunk in member_name_chunks:
                member_list.update({m['character_id']: m['character_name'] for m in name_chunk})

            # bulk create new member models
            missing_members = [m_id for m_id in member_ids if
                               not CorpMember.objects.filter(corpstats=self, character_id=m_id).exists()]
            CorpMember.objects.bulk_create(
                [CorpMember(character_id=m_id, character_name=member_list[m_id], corpstats=self) for m_id in
                 missing_members])

            # purge old members
            self.members.exclude(character_id__in=member_ids).delete()

            # update the timer
            self.save()

        except TokenError as e:
            logger.warning("%s failed to update: %s" % (self, e))
            if self.token.user:
                notify(self.token.user, "%s failed to update with your ESI token." % self,
                       message="Your token has expired or is no longer valid. Please add a new one to create a new CorpStats.",
                       level="error")
            self.delete()
        except HTTPForbidden as e:
            logger.warning("%s failed to update: %s" % (self, e))
            if self.token.user:
                notify(self.token.user, "%s failed to update with your ESI token." % self,
                       message="%s: %s" % (e.status_code, e.message), level="error")
            self.delete()
        except AssertionError:
            logger.warning("%s token character no longer in corp." % self)
            if self.token.user:
                notify(self.token.user, "%s cannot update with your ESI token." % self,
                       message="%s cannot update with your ESI token as you have left corp." % self, level="error")
            self.delete()
Example #29
0
def run_smart_group_update(sg_id, can_grace=False, fake_run=False):
    # Run Smart Group and add/remove members as required
    smart_group = SmartGroup.objects.get(id=sg_id)
    if smart_group.can_grace:
        can_grace = smart_group.can_grace
    logger.info("Starting '{}' Checks. {}".format(
        smart_group.group.name, "(Fake)" if fake_run else ""))

    group = smart_group.group
    all_users = group.user_set.all().values_list("username", flat=True)
    all_graced_members = {}
    _all_graced_members = GracePeriodRecord.objects.filter(
        group=smart_group, user__username__in=all_users)
    if smart_group.can_grace:
        for gm in _all_graced_members:
            if gm.user.username not in all_graced_members:
                all_graced_members[gm.user.username] = {}
            all_graced_members[gm.user.username][gm.grace_filter] = gm

    if smart_group.auto_group:
        states = group.authgroup.states.all()
        if states.count() > 0:
            users = User.objects.filter(profile__state__in=states)
        else:
            users = User.objects.filter(profile__main_character__isnull=False)
    else:
        users = group.user_set.all()

    users = users.select_related("profile",
                                 "profile__main_character").distinct()

    bulk_checks = {}
    filters = smart_group.filters.all()
    for f in filters:
        try:
            bulk_checks[f.id] = f.filter_object.audit_filter(users)
        except Exception as e:
            pass

    count = 0
    added = 0
    removed = 0
    pending_removals = 0
    # print(all_graced_members)
    for u in users:
        try:
            assert u.profile.main_character is not None
        except:  # no main character kickeroo
            removed += 1
            if not fake_run:
                u.groups.remove(group)
                # remove user
                message = '{} - Removed from "{}" No Main'.format(
                    u.username, group.name)
                send_discord_dm(u, "Removed From Group", message, Color.red())
                notify(u, f'Auto Group Removal "{group.name}"', message,
                       "warning")
                logger.info(message)
            continue

        checks = []
        for f in filters:
            _c = {"name": f.filter_object.description, "filter": f}
            try:
                _c["check"] = bulk_checks[f.id][u.id]['check']
                _c["message"] = bulk_checks[f.id][u.id]['message']
            except Exception as e:
                try:
                    _c["check"] = f.filter_object.process_filter(u)
                    _c["message"] = ""
                except Exception as e:
                    _c["check"] = False
                    _c["message"] = "Filter Failed"
            checks.append(_c)
        if len(checks) == 0:
            break

        count += 1
        out = True
        reasons = []
        for c in checks:
            if not c.get("check", False):
                out = False
                reasons.append(f'{c.get("name", "")}  {c.get("message", "")}')

        if out:
            if u.username in all_graced_members:
                if not fake_run:
                    GracePeriodRecord.objects.filter(
                        user=u, group=smart_group).delete()
            if smart_group.auto_group:
                if u.username not in all_users:
                    # Add user
                    added += 1
                    if not fake_run:
                        u.groups.add(group)
                        message = f"{u.profile.main_character.character_name} - Passed the requirements for {group.name}"
                        notify(u, f'Auto Group Added "{group.name}"', message,
                               "info")
                        logger.info(message)

        else:
            if u.username in all_users:
                remove = False
                grace = False
                was_graced = False
                for c in checks:
                    filter_name = c.get("filter")
                    grace_days = filter_name.grace_period
                    expires = timezone.now() + timedelta(days=grace_days)
                    if u.username in all_graced_members:
                        if filter_name in all_graced_members.get(
                                u.username, {}):
                            if all_graced_members[
                                    u.username][filter_name].is_expired():
                                all_graced_members[
                                    u.username][filter_name].delete()
                                remove = True
                                continue
                            else:
                                was_graced = True
                        elif not c.get("check", False):
                            if can_grace and grace_days > 0:
                                grace = True
                                if not fake_run and get_failure(sg_id, u.id):
                                    GracePeriodRecord.objects.create(
                                        user=u,
                                        group=smart_group,
                                        grace_filter=filter_name,
                                        expires=expires,
                                    )
                            else:
                                remove = True
                                continue
                    elif not c.get("check", False):
                        if can_grace and grace_days > 0:
                            grace = True
                            if not fake_run and get_failure(sg_id, u.id):
                                GracePeriodRecord.objects.create(
                                    user=u,
                                    group=smart_group,
                                    grace_filter=filter_name,
                                    expires=expires,
                                )
                        else:
                            remove = True
                            continue
                if remove:
                    removed += 1
                    if not fake_run:
                        u.groups.remove(group)
                        # remove user
                        message = '{} - Removed from "{}" due to failing:\n```{}\n```'.format(
                            u.profile.main_character.character_name,
                            group.name,
                            "\n``` ```".join(reasons),
                        )
                        send_discord_dm(u,
                                        "Removed From Group",
                                        message,
                                        color=0xe74c3c)
                        notify(u, f'Auto Group Removal "{group.name}"',
                               message, "warning")
                        logger.info(message)
                elif grace:
                    pending_removals += 1
                    if not fake_run:
                        if get_failure(sg_id, u.id):
                            message = (
                                '{} - Pending Removal from "{}" due to failing:\n```{}\n```'
                                .format(
                                    u.profile.main_character.character_name,
                                    group.name,
                                    "\n``` ```".join(reasons),
                                ))
                            send_discord_dm(u,
                                            "Group Removal Pending",
                                            message,
                                            color=0xe67e22)
                            notify(
                                u,
                                f'Auto Group Removal Pending "{group.name}"',
                                message,
                                "warning",
                            )
                            logger.info(message)
                            clear_failure(sg_id, u.id)
                        else:
                            set_failure(sg_id, u.id)
                elif was_graced:
                    pending_removals += 1

    message = "**{4}**: Checked {0} Members, Approved {5}, Added {1}, Removed {2}(Pending Removals {6}) {7}".format(
        count,
        added,
        removed,
        len(all_users),
        group.name,
        group.user_set.all().count(),
        pending_removals,
        "(Fake)" if fake_run else "",
    )

    logger.info(message)

    send_update_to_webhook(group, message)

    # cleanup graces
    GracePeriodRecord.objects.filter(group=smart_group).exclude(
        user__in=group.user_set.all()).delete()

    return message
Example #30
0
    def update(self):
        try:
            c = self.token.get_esi_client()

            # make sure the token owner is still in this corp

            assert c.Character.get_characters_character_id(
                character_id=self.token.character_id).result()['corporation_id'] == int(self.corp.corporation_id)

            # get member tracking data and retrieve member ids for translation
            tracking = c.Corporation.get_corporations_corporation_id_membertracking(corporation_id=self.corp.corporation_id).result()
            member_ids = [t['character_id'] for t in tracking]

            # requesting too many ids per call results in a HTTP400
            # the swagger spec doesn't have a maxItems count
            # manual testing says we can do over 350, but let's not risk it
            member_id_chunks = [member_ids[i:i + 255] for i in range(0, len(member_ids), 255)]
            member_name_chunks = [c.Universe.post_universe_names(ids=id_chunk).result() for id_chunk in
                                  member_id_chunks]

            member_list = {t['character_id']: t for t in tracking}
            for name_chunk in member_name_chunks:
                for name in name_chunk:
                    member_list[name['id']]['character_name'] = name.get('name', "")

            # get ship and location names
            for t in tracking:
                t['ship_type_name'] = c.Universe.get_universe_types_type_id(type_id=t['ship_type_id']).result()['name'] #TODO use the inbuilt eve provider
                #locations = c.Universe.post_universe_names(ids=[t['location_id']]).result()
                #t['location_name'] = locations[0]['name'] if locations else ''  # might be a citadel we can't know about
                member_list[t['character_id']].update(t)

            # purge old members
            CorpMember.objects.filter(corpstats=self).exclude(character_id__in=member_ids).delete()

            # bulk update and create new member models
            for c_id, data in member_list.items():
                CorpMember.objects.update_or_create(character_id=c_id, corpstats=self, defaults=data)

            # update the timer
            self.save()

        except TokenError as e:
            logger.warning("%s failed to update: %s" % (self, e))
            if self.token.user:
                notify(self.token.user, "%s failed to update with your ESI token." % self,
                       message="Your token has expired or is no longer valid. Please add a new one to create a new CorpStats.",
                       level="error")
            self.delete()
        except HTTPForbidden as e:
            logger.warning("%s failed to update: %s" % (self, e))
            if self.token.user:
                notify(self.token.user, "%s failed to update with your ESI token." % self,
                       message="%s: %s" % (e.status_code, e.message), level="error")
            self.delete()
        except AssertionError:
            logger.warning("%s token character no longer in corp." % self)
            if self.token.user:
                notify(self.token.user, "%s cannot update with your ESI token." % self,
                       message="%s cannot update with your ESI token as you have left corp." % self, level="error")
            self.delete()
Example #31
0
    def update(self):
        try:
            # make sure the token owner is still in this corp
            corp_id = esi.client.Character.get_characters_character_id(
                character_id=self.token.character_id).result(
                )['corporation_id']
            assert corp_id == int(self.corp.corporation_id)

            # get member tracking data and retrieve member ids for translation
            tracking = esi.client.Corporation.get_corporations_corporation_id_membertracking(
                corporation_id=self.corp.corporation_id,
                token=self.token.valid_access_token()).result()
            member_ids = [t['character_id'] for t in tracking]

            # requesting too many ids per call results in a HTTP400
            # the swagger spec doesn't have a maxItems count
            # manual testing says we can do over 350, but let's not risk it
            member_id_chunks = [
                member_ids[i:i + 255] for i in range(0, len(member_ids), 255)
            ]
            member_name_chunks = [
                esi.client.Universe.post_universe_names(ids=id_chunk).result()
                for id_chunk in member_id_chunks
            ]

            member_list = {t['character_id']: t for t in tracking}
            for name_chunk in member_name_chunks:
                for name in name_chunk:
                    member_list[name['id']]['character_name'] = name.get(
                        'name', "")

            # get ship and location names
            # TODO make this fast!
            for t in tracking:
                t['ship_type_name'] = ""
                if 'ship_type_id' in t:  # non req'd esi model
                    if t['ship_type_id'] is not None:
                        try:
                            t['ship_type_name'] = esi.client.Universe.get_universe_types_type_id(
                                type_id=t['ship_type_id']).result()[
                                    'name']  #TODO use the inbuilt eve provider
                        except ValidationError as e:
                            logger.error(e)
                            pass  # Bad id or crappy esi call...

                #locations = c.Universe.post_universe_names(ids=[t['location_id']]).result()
                #t['location_name'] = locations[0]['name'] if locations else ''  # might be a citadel we can't know about

                member_list[t['character_id']].update(t)

            # purge old members
            old_members = CorpMember.objects.filter(corpstats=self)
            if old_members.exists():
                old_members._raw_delete(old_members.db)

            member_db_create = []
            # bulk update and create new member models
            for c_id, data in member_list.items():
                member_db_create.append(CorpMember(corpstats=self, **data))

            CorpMember.objects.bulk_create(member_db_create)
            # update the timer
            self.save()

        except TokenError as e:
            logger.warning("%s failed to update: %s" % (self, e))
            if self.token.user:
                notify(
                    self.token.user,
                    "%s failed to update with your ESI token." % self,
                    message=
                    "Your token has expired or is no longer valid. Please add a new one to create a new CorpStats.",
                    level="error")
            self.delete()
        except HTTPForbidden as e:
            logger.warning("%s failed to update: %s" % (self, e))
            if self.token.user:
                notify(self.token.user,
                       "%s failed to update with your ESI token." % self,
                       message="%s: %s" % (e.status_code, e.message),
                       level="error")
            self.delete()
        except AssertionError as e:
            logger.warning("%s token character no longer in corp." % self)
            if self.token.user:
                notify(
                    self.token.user,
                    "%s cannot update with your ESI token." % self,
                    message=
                    "%s cannot update with your ESI token as you have left corp."
                    % self,
                    level="error")
            self.delete()